0

ビューからデータベース値を検索しようとしています。ビューからデータベースを検索

以下のエラーが表示されます。販売

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. 

私はよく分からない、私はこのエラーを取得mは、なぜ、 EXEC Customer.sp_FindInViewsスティーブン:

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 

コードがコンパイルされますが、それは以下のように実行したときにエラーを与えません。私はそれらを扱っていると感じています。これに対する入力は参考になります。

ありがとうございました。

+0

私はどのくらいカーソルを嫌いますか? :) –

答えて

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 

は、(最初​​の試みはそれらを閉じるできるようになる前にエラーが発生したとして)、元のカーソルがまだ開いているbecuaseあなたが手順をもう一度実行するとエラーが発生する「カーソルがすでにオープンしています」。

+0

はい、本当にカーソルについての私のエラーを解決....しかし、目的....ありがとう! – user1141584

0

あなたが探していた答えであるかどうかは不明ですが、SQLSearch(http://www.red-gate.com/products/sql-development/sql-search/)はデータベースを検索するための優れたツールです(もちろん、ビューを検索するように設定することができます)、それは無料です...

+0

はい、それに似ています...しかし、私はまだそれのためのSQLソリューションを取得したいと思って...ありがとう!!! – user1141584

関連する問題