0

我試圖通過視圖搜索數據庫值。通過視圖搜索數據庫

我被困在下面的錯誤。

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斯蒂芬,銷售

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. 

我不敢肯定,爲什麼我米收到這個錯誤。我覺得我在處理他們。任何關於此的輸入都會有所幫助。

謝謝。

+0

我有沒有提到我討厭遊標有多少?!? :) – 2012-02-21 07:48:25

回答

0

在我看來,你已經改變了光標名稱。首先聲明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 

「光標已經打開」當您運行的程序進行第二次監守原來光標仍然是開放的(如第一次嘗試能夠關閉之前出錯)發生錯誤。

+0

是的,這確實解決了我關於遊標的錯誤....但不是目的....謝謝! – user1141584 2012-02-21 23:25:05

0

不知道這是否是您一直在尋找的答案,但SQLSearch(http://www.red-gate.com/products/sql-development/sql-search/)是搜索數據庫的絕佳工具(當然,您可以將它設置爲僅搜索視圖),並且它是免費的...

+0

是的,類似於...但我仍然想要得到一個SQL解決方案...謝謝! – user1141584 2012-02-21 23:24:14