Динамический SQL для проверки существования хранимой процедуры - PullRequest
0 голосов
/ 21 мая 2019

Я хочу выполнить этот запрос с использованием динамического SQL, но он не влияет на переменную @Exists. В чем проблема?

Цель: проверить, существует ли в базе данных хранимая процедура с именем @TransformProcName @TargetDb:

SET @Sql = N'IF NOT EXISTS (SELECT *
                FROM ' + QUOTENAME(@TargetServer) + '.' + QUOTENAME(@TargetDB) + ' 
                WHERE type = ''P'' AND OBJECT_ID = OBJECT_ID(N'''+QUOTENAME(@TargetSchema)+'.'+QUOTENAME(@TransformProcName)+'''))
                    SET @Exists = 0
             ELSE
                    SET Exists = 1'

EXEC sp_executesql @Sql,N'@Exists bit OUTPUT', @Exists OUTPUT

1 Ответ

3 голосов
/ 21 мая 2019

У вас есть пара проблем здесь. Сначала у вас было SET Exists = 1, которое должно быть SET @Exists = 1, но вы также ссылались на недопустимый объект. Вам нужно будет использовать sys.procedures и sys.schemas здесь, и вы не можете использовать OBJECT_ID, так как это будет выполняться в контексте базы данных, к которой вы подключены. Это дает вам следующее (также приведенное в порядок динамический SQL):

DECLARE @SQL nvarchar(MAX);

DECLARE @TargetServer sysname, @TargetDB sysname, @TargetSchema sysname, @TransformProcName sysname;

SET @TargetDB = N'Sandbox';
SET @TargetSchema = N'dbo';
SET @TransformProcName = N'sample_sp';

DECLARE @Exists bit;


SET @Sql = N'IF NOT EXISTS (SELECT *' + NCHAR(13) + NCHAR(10) +
           N'               FROM ' + QUOTENAME(@TargetServer) + N'.' + QUOTENAME(@TargetDB) + '.sys.procedures p' + NCHAR(13) + NCHAR(10) +
           N'                    JOIN sys.schemas s ON p.schema_id = s.schema_id' + NCHAR(13) + NCHAR(10) +
           N'               WHERE p.[name] = @TransformProcName' + NCHAR(13) + NCHAR(10) +
           N'                 AND s.[name] = @TargetSchema)' + NCHAR(13) + NCHAR(10) +
           N'       SET @Exists = 0' + NCHAR(13) + NCHAR(10) +
           N'ELSE' + NCHAR(13) + NCHAR(10) +
           N'       SET @Exists = 1;'


PRINT @SQl;
EXEC sp_executesql @Sql,N'@TransformProcName sysname, @TargetSchema sysname, @Exists bit OUTPUT', @TransformProcName = @TransformProcName, @TargetSchema = @TargetSchema, @Exists =  @Exists OUTPUT;
PRINT @Exists;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...