存储过程有什么问题

时间:2014-01-02 11:52:34

标签: sql-server-2008 stored-procedures

我有一个名为Std_Components的表,它就像一个带有关联表的组件列表的索引。列AssociatedTable包含实际包含组件数据的表的名称。

请检查以下图片 -

enter image description here

以下是Std_SteeringPumps

的表格数据

enter image description here

我正在尝试创建一个存储过程,该过程将复制Std_Components表以及具有新名称的所有关联表。对于前者假设我提供001作为此存储过程的参数,我应该能够创建新表,如C001_ComponentsC001_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;'不是有效的标识符。

任何人都可以帮我解决这个问题。

感谢您分享您的时间和智慧。

3 个答案:

答案 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已经过验证)