Поиск в базе данных через просмотры - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь найти в базе данных значения в представлениях.

Я застрял в приведенной ниже ошибке.

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.

Я не уверен, почему я получаю эту ошибку.Я чувствую, что я справляюсь с ними.Любой вклад по этому вопросу будет полезен.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Не уверен, что это именно тот ответ, который вы искали, но SQLSearch (http://www.red -gate.com / products / sql-development / sql-search /) - отличный инструмент для поиска в базах данных (конечно, вы можно установить только для поисковых просмотров) и это бесплатно ...

0 голосов
/ 21 февраля 2012

Похоже, вы изменили имена курсоров.Вы начинаете с объявления 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 

Ошибки "курсор уже открыт" возникают при повторном запуске процедуры, потому что исходные курсоры все еще открыты (как первая попытка с ошибкой, прежде чем их можно было закрыть).

...