我有以下程序:
CREATE PROCEDURE [dbo].[Test1]
AS
BEGIN
INSERT INTO [My_Database].[My_Schema].[My_Table]
(...lists columns...)
SELECT ... lots of columns from joined query...
END
我不想硬编码“[My_Database]。[My_Schema]”,而是想从预定义的表中选择它作为变量:
CREATE PROCEDURE [dbo].[Test1]
AS
BEGIN
SELECT @myDB = [My_DB] FROM [my_custom_table]
--INSERT INTO [My_Database].[My_Schema].[My_Table]
INSERT INTO @myDB.[My_Table]
(...lists columns...)
SELECT ... lots of columns from joined query...
END
如果我像上面那样使用它就行不通。我需要用: EXEC sp_executesql(whole_sql_statement_in_quotes)
我的问题是我有很多这些程序要改为使用变量而不是硬编码。将每个语句转换为长字符串需要永远。
还有其他方法吗?我错过了什么?
此致
答案 0 :(得分:0)
有一个想法,您可以在每个过程开始时使用动态SQL删除并重新创建同义词,然后您可以将每个Insert语句保留为Insert Into MySynonym
DROP SYNONYM MySynonym -- Must create it first before running this bit!
DECLARE @sql nvarchar(max)
SET @SQL = 'CREATE SYNONYM MySynonym
FOR ' + @myDB + '.test1'
EXEC sp_Executesql @sql
INSERT INTO MySynonym
SELECT ...
这将为您提供一些代码,您可以将粘贴复制到每个SP中。如果要插入的表对于每个SP都不同,您也可以声明它并将其构建到CREATE SYNONYM语句中
SET @SQL = 'CREATE SYNONYM MySynonym
FOR ' + @myDB + '.' + @MyTable
要先截断每个表,你还需要使用DynamicSQL,因为你不能删除同义词
SET @SQL = 'Truncate Table ' + @MyTable
EXEC sp_Executesql @sql