У вас есть пара проблем здесь. Сначала у вас было 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;