【发布时间】:2023-03-31 10:45:01
【问题描述】:
在存储过程中,我想更改我的代码,以便在其他数据库上使用它。 DATA:是数据库的名称 我有其他数据库,例如:DATA2 和 DATA3。我需要用参数@LocalBase 替换DATA。
IF NOT EXISTS (SELECT * FROM ['' + @localBase + ''].SYS.SCHEMAS WHERE NAME = @DestinationSchema)
BEGIN
SELECT @SQL = N'USE DATA; EXEC(''CREATE SCHEMA '' + @DestinationSchema + '')'
EXEC sp_executesql @SQL
INSERT INTO dbo.TableLog SELECT @id, @SourceServer, @SourceSchema, 'GetAllTables', @DestinationSchema, CURRENT_TIMESTAMP, 'Schema ' + @DestinationSchema + ' created', 2
END
这样做是否可能(正确)? `
@SQL=N'IF NOT EXISTS (SELECT * FROM ['' + @localBase + ''].SYS.SCHEMAS WHERE NAME = @DestinationSchema)'
EXEC sp_executesql @SQL
BEGIN
SELECT @SQL = N'USE ['' + @localBase + '']; EXEC(''CREATE SCHEMA '' + @DestinationSchema + '''')'
EXEC sp_executesql @SQL
INSERT INTO dbo.TableLog SELECT @id, @SourceServer, @SourceSchema, 'GetAllTables', @DestinationSchema, CURRENT_TIMESTAMP, 'Schema ' + @DestinationSchema + ' created', 2
END
`
我想这样调用存储过程:
DECLARE @RC int
DECLARE @SourceServer nvarchar(255)
DECLARE @localBase nvarchar(255)
SET @SourceServer = 'Serv1,10001'
SET @localBase = 'DATA1'
EXECUTE @RC = [dbo].[stor_proc_name]
@SourceServer,
@localBase
【问题讨论】:
-
为什么要像这样动态创建模式?这有很多危险信号,表明这里存在一些非常严重的设计问题。当您开始使用动态 sql 时,您需要小心不要让我们的老朋友 bobbly 表访问您。 bobby-tables.com
-
这段代码是存储过程代码的一部分。将数据库服务器的表复制到另一台服务器。存储过程为 DATA 数据库运行。但我想让它通用以将其应用于其他数据库
-
这有点吓人,但看看你的变量@LocalBase 的位置。由于这现在是动态 sql 字符串的一部分,因此您将需要 ''' 而不是 ''。按照编码,您的字符串中有一个字符串文字。您需要养成在执行动态 sql 之前检查它的习惯。如果您查看字符串,您会很快注意到语法错误。
标签: sql-server if-statement stored-procedures parameters exists