我有一个名为Std_Components
的表,它就像一个带有关联表的组件列表的索引。列AssociatedTable
包含实际包含组件数据的表的名称。
请检查以下图片 -
以下是Std_SteeringPumps
我正在尝试创建一个存储过程,该过程将复制Std_Components
表以及具有新名称的所有关联表。对于前者假设我提供001作为此存储过程的参数,我应该能够创建新表,如C001_Components
,C001_SteeringPumps
等。
这是我到目前为止所做的:
ALTER PROCEDURE [dbo].[sgi_sp_CreateTablesForNewCompany]
-- Add the parameters for the stored procedure here
@CompanyId varchar(5)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- declare variables
declare @qry as varchar(2000)
declare @compTblName as varchar(100)
set @compTblName = 'C'+@companyId +'_Components'
-- Check if table already exists
IF object_id(@compTblName) is not null
return
-- Create main component index table by copying standard component table --
set @qry = 'Select * into '+@compTblName+' From Std_Components;';
--print @qry
--execute (@qry)
set @qry =@qry + 'Update C'+@companyId +'_Components Set AssociatedTable=''C'+@companyId +'''+substring(AssociatedTable,4,200);';
--print @qry
--exec @qry
-- Create all child tables --
Select * Into #TempTbl From dbo.Std_Components
Declare @Id int
While (Select Count(*) From #TempTbl) > 0
Begin
declare @rowTableName as varchar(50)
declare @compNewTbl as varchar(50)
Select Top 1 @rowTableName=AssociatedTable, @Id = Id From #TempTbl
set @compNewTbl = 'C'+@companyId + substring(@rowTableName,4,200);
set @qry = @qry + 'Select * into '+@compNewTbl+' From ' + @rowTableName + ';'
--print @qry
--exec @qry
Delete #TempTbl Where Id = @Id
End
print @qry
exec @qry
END
以下是它生成的查询的print语句的输出 -
Select * into C001_Components From Std_Components;
Update C001_Components Set AssociatedTable='C001'+substring(AssociatedTable,4,200);
Select * into C001_SteeringPumps From Std_SteeringPumps;
但是当执行存储过程时,我收到以下错误 -
Msg 203,Level 16,State 2,Procedure sgi_sp_CreateTablesForNewCompany,Line 56
名称'Select * into C001_Components From Std_Components; Update C001_Components Set AssociatedTable ='C001'+ substring(AssociatedTable,4,200);从Std_SteeringPumps中选择*进入C001_SteeringPumps;'不是有效的标识符。
任何人都可以帮我解决这个问题。
感谢您分享您的时间和智慧。
答案 0 :(得分:3)
您得到的错误是因为EXEC语句(存储过程的最后一行)需要在@qry变量周围加上括号,以便它变为
EXEC(@qry)
没有括号,它将整个SQL字符串视为存储过程名称。
答案 1 :(得分:1)
无效的标识符在AssociatedTable部分
附近 Set AssociatedTable='C001'+substring(AssociatedTable,4,200);
将无法运行,因为AssociatedTable没有子字符串的范围 - 字符串需要完全包含表的名称才能执行
答案 2 :(得分:1)
而不是
exec @qry;
你需要
exec sp_executesql @qry;
您还需要将@qry的类型更改为NVARCHAR
。请注意,由于动态sql,proc很容易出现SQL注入和其他转义问题(即确保@CompanyId
已经过验证)