具有输入表名称的SQL Merge语句

时间:2018-08-02 20:29:13

标签: sql sql-server

我有一种方案可以将数据从一个表复制到另一个表。复制时,我需要存储table1和table2的Identity值。

create procedure procedure1
(@sourceClientNumber       int,
@destinationClientNumber  int,
@statusID                 varchar(10))

as

 declare @scriptSql nvarchar(max);
declare @Temp_ClientScriptTable table
     (newScriptID int,
     oldScriptID int);

 begin

    SET @CreatedBy = 'Initaial Creation'
    SET @CreatedByName= 'Initial Creation'
    SET @CreatedDateTime = GETDATE()

 SET @scriptSql =  'Merge into [dbo].[Client_'+@destinationClientNumber +'_Script] using
                       (select  ScriptID,
                                ScriptName,
                                ScriptVersion,
                                Description,
                                FacilityID,
                                StatusID,
                                Shared,
                                ScriptTYpeID
                          from [dbo].[Client_'+@sourceClientNumber +'_Script]
                            where statusID = ' +@statusID + '                               
                       ) scripts on 1 = 0
                      When not matched then                             
                        insert ([ScriptName],
                                [ScriptVersion],
                                [CreatedBy],
                                [CreatedByName],
                                [CreatedDateTime],                          
                                [Description],
                                [FacilityID],
                                [StatusID],
                                [Shared],
                                [ScriptTypeID]) 
                         values (scripts.ScriptName,
                                 scripts.ScriptVersion,'
                                 + @CreatedBy + ','
                                 + @CreatedByName + ','
                                 + @CreatedDateTime + ',
                                 scripts.Description,
                                 scripts.FacilityID,
                                 scripts.StatusID,
                                 scripts.Shared,
                                 scripts.ScriptTypeID)
                    output Inserted.ScriptID, scripts.ScriptID
                      into' + @Temp_ClientScriptTable + '(newScriptID, oldScriptID)'                    

 EXECUTE sp_executesql @scriptSql

我在@Temp_ClientScriptTable处收到错误消息。

请您帮我一下。

2 个答案:

答案 0 :(得分:1)

这里的主要问题是数据库设计错误。
您有多个具有相同结构的表,但名称之间仅相差一个数字,这意味着您正在混合数据(数字)和元数据(表名称)。

您应该为每个客户端添加一个列,而不是为每个客户端使用不同的表。

如果可以这样做,还可以消除在需要寻址此表的任何地方使用动态SQL的需求。

答案 1 :(得分:0)

根本原因是,@Temp_ClientScriptTable是一个表变量,不能参与字符串连接。 您@scriptSql的最后一行应该是-

into @Temp_ClientScriptTable(newScriptID, oldScriptID)'

代替

into' + @Temp_ClientScriptTable + '(newScriptID, oldScriptID)'

在字符串连接中使用它们时,还需要在varchar变量周围添加单引号。您最终的@scriptSql将是-

SET @scriptSql =  'Merge into [dbo].[Client_'+@destinationClientNumber +'_Script] using
                       (select  ScriptID,
                                ScriptName,
                                ScriptVersion,
                                Description,
                                FacilityID,
                                StatusID,
                                Shared,
                                ScriptTYpeID
                          from [dbo].[Client_'+@sourceClientNumber +'_Script]
                            where statusID = ''' +@statusID + '''                               
                       ) scripts on 1 = 0
                      When not matched then                             
                        insert ([ScriptName],
                                [ScriptVersion],
                                [CreatedBy],
                                [CreatedByName],
                                [CreatedDateTime],                          
                                [Description],
                                [FacilityID],
                                [StatusID],
                                [Shared],
                                [ScriptTypeID]) 
                         values (scripts.ScriptName,
                                 scripts.ScriptVersion,'''
                                 + @CreatedBy + ''','''
                                 + @CreatedByName + ''','
                                 + @CreatedDateTime + ',
                                 scripts.Description,
                                 scripts.FacilityID,
                                 scripts.StatusID,
                                 scripts.Shared,
                                 scripts.ScriptTypeID)
                    output Inserted.ScriptID, scripts.ScriptID
                      into @Temp_ClientScriptTable(newScriptID, oldScriptID)' 

要调试此类问题,您应该始终打印级联查询,并查看查询的外观-

print @scriptSql