【问题标题】:Search database through Views通过视图搜索数据库
【发布时间】:2012-02-21 05:30:44
【问题描述】:

我正在尝试通过视图搜索数据库值。

我陷入了以下错误。

USE AdventureWorks
GO

--EXEC Customer.sp_FindInViews Stephen, Sales

ALTER PROCEDURE Customer.sp_FindInViews @stringToFind VARCHAR(100), @schema sysname
AS
SET NOCOUNT ON

DECLARE   
      @ViewName AS nVarChar(128)
      , @TmpQuery AS nVarChar(500)
      , @Out3 as int

    , @sqlCommand VARCHAR(8000)
    , @where VARCHAR(8000)
    , @columnName sysname
    , @cursor VARCHAR(8000)

DECLARE Outer_Cursor CURSOR FOR
    SELECT schema_name(schema_id)+'.'+name as "View_Name",schema_id FROM [sys].[all_views] 
    where schema_id  in (@schema)

    OPEN Cur_Views
        FETCH NEXT FROM Cur_Views INTO @ViewName
        WHILE @@Fetch_Status = 0 
        BEGIN
            SET @sqlCommand = 'SELECT * FROM ' + @ViewName + ' WHERE'
            SET @where = ''

        DECLARE col_cursor CURSOR FOR
            SELECT syscolumns.name FROM sys.sysobjects "sysobjects"
            INNER JOIN sys.syscolumns "syscolumns"
            on syscolumns.id = sysobjects.id
            WHERE (sysobjects.type = 'V'    and SCHEMA_NAME(sysobjects.uid) + '.' +sysobjects.name = @ViewName)

            OPEN col_cursor   
                FETCH NEXT FROM col_cursor INTO @columnName   
                WHILE @@FETCH_STATUS = 0   
                BEGIN   
                    IF @where <> ''
                        SET @where = @where + ' OR'
                        ---------------------------------------------------------------------------
                        SET @where = @where + ' ' + @columnName + ' LIKE ''' + @stringToFind + ''''
                        SET @sqlCommand = @sqlCommand +   @where

                        CREATE TABLE #Data (var varchar)
                        SELECT  @TmpQuery = @sqlCommand
                        INSERT #Data exec (@TmpQuery)
                        SELECT @Out3 = var from #Data
                        PRINT @Out3
                        DROP TABLE #Data
                    FETCH NEXT FROM col_cursor INTO   @columnName   
                END   
            CLOSE col_cursor   
            DEALLOCATE col_cursor       
    CLOSE Outer_Cursor
    DEALLOCATE Outer_Cursor             
END
GO

代码可以编译,但执行时会报错,如下所示: EXEC Customer.sp_FindInViews Stephen,销售

Msg 16915, Level 16, State 1, Procedure sp_FindInViews, Line 19
A cursor with the name 'Outer_Cursor' already exists.
Msg 16905, Level 16, State 1, Procedure sp_FindInViews, Line 22
The cursor is already open.
Msg 16924, Level 16, State 1, Procedure sp_FindInViews, Line 23
Cursorfetch: The number of variables declared in the INTO list must match that of selected columns.

我不确定,为什么会出现此错误。我觉得我正在处理它们。对此的任何意见都会有所帮助。

谢谢。

【问题讨论】:

  • 我有没有提到我多么讨厌游标?!? :)

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


【解决方案1】:

在我看来您已经更改了光标名称。首先声明 Outer_Cursor,然后打开一个名为 Cur_Views 的游标。

此外,当您从游标中获取时,您只需将游标值放入 1 个变量中,在游标声明中您会列出 2 个字段(View_Name 和 schema_id)。

DECLARE Outer_Cursor CURSOR FOR 
    SELECT schema_name(schema_id)+'.'+name as "View_Name",schema_id FROM [sys].[all_views]  
    where schema_id  in (@schema) 

    OPEN Cur_Views
       FETCH NEXT FROM Cur_Views INTO @ViewName 

当您再次运行该过程时会出现“游标已打开”错误,因为原始游标仍处于打开状态(因为第一次尝试在能够关闭它们之前出错)。

【讨论】:

  • 是的,这确实解决了我关于光标的错误....但不是目的....谢谢!!!
【解决方案2】:

不确定这是否是您一直在寻找的答案,但 SQLSearch (http://www.red-gate.com/products/sql-development/sql-search/) 是搜索数据库 (当然,您可以将其设置为仅搜索视图)而且它是免费的...

【讨论】:

  • 是的,类似于...但我仍然想为此获得一个 SQL 解决方案...谢谢!!!
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2012-07-15
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多