我有一种方案可以将数据从一个表复制到另一个表。复制时,我需要存储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处收到错误消息。
请您帮我一下。
答案 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