创建表的奇怪问题

时间:2012-04-13 12:00:23

标签: sql-server tsql ssis

我正在研究SSIS包。我有一个包含名单的数组。这些名称将是表名。

要创建这些表,我循环SQL任务编辑器EXECUTING接受参数(表的名称)的存储过程

存储过程的代码:

ALTER PROCEDURE [dbo].[TLP.CreaTable]
(
    @TableName  VARCHAR(255)
)
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @SQL VARCHAR(4000)
    SET @SQL = 'IF NOT EXISTS ( SELECT  * 
                                FROM    sysobjects 
                                WHERE   id = OBJECT_ID(N''[dbo].' + @TableName + ''') 
                                AND     xtype in (N''U'')) 
                    CREATE TABLE [dbo].' + @TableName + '(
                        [Serial] [int] NOT NULL,
                        [Marc] [bit] NOT NULL,
                        [Sell] [bit] NOT NULL
) ON [PRIMARY]'

    EXEC (@SQL)
END

当数组中的一个名称是数字时,会出现问题。我必须说所有的名字都带着[]进入存储过程。我在每次执行之前都创建了一个断点,当表名是一个数字时,它会在SSIS中带来错误(同样为了让您更好地了解我从SQL Server Management Studio运行存储过程,并且错误仍然存​​在,我使用了表名[3001],这实际上是导致问题的真实姓名。)

EXEC dbo.[TLP.CreaTable] [3001]
  

消息170,级别15,状态1,行5第5行:'。3001'附近的语法不正确。

如果我做的话

EXEC dbo.[TLP.CreaTable] RANDOM_NAME

它完美无缺

显然有一些'。'在中间。但我不能在代码中找到它。

由于

修改

这是引用的问题。它在SQL Server Management Studio中工作。但是当我在SSIS中尝试它时,错误仍然存​​在。尝试修改C#代码以添加'[]'而不仅仅是[]并且它不能正常工作。

SSIS内部的错误如下:

  

错误:创建表030698中的0xC002F210,执行SQL任务:执行查询“EXEC dbo。[TLP.CreaTable]?”失败并出现以下错误:“将结果提取到类型变量(DBTYPE_I4)时发生错误”。   可能的失败原因:查询问题,“ResultSet”   属性设置不正确,参数设置不正确,或   连接未正确建立。

使用断点我看了表名的变量,确定'[3001]'

SQL任务编辑器中的调用是

EXEC dbo.[TLP.CreaTable] ?

但不知怎的,EXEC dbo.[TLP.CreaTable] '[3001]'在SQL Server Management Studio中有效,但不在SSIS中。

有什么想法吗?感谢。

编辑2

由于我对论坛很陌生,我应该在一个新的“问题”中提出第二个问题吗?由于在该主题中发布的问题得到解决。 非常感谢。

编辑3

固定。 CREATE TABLE SQL任务编辑器中的参数很长,将其更改为varchar并且顺利进行。 感谢

4 个答案:

答案 0 :(得分:3)

您可以尝试使用QuoteName函数包装@TableName,该函数应该为您转义表名。将该行更改为:

CREATE TABLE [dbo].' + QuoteName(@TableName) + '(

编辑:也可以将表名包装在方括号中,以防它是保留字:

CREATE TABLE [dbo].[' + QuoteName(@TableName) + '] (

答案 1 :(得分:2)

尝试在表名

周围使用'
EXEC dbo.[TLP.CreaTable] '[3001]'

答案 2 :(得分:2)

周围添加括号
[' + @TableName + ']

因此商店程序如下所示:

ALTER PROCEDURE [dbo].[TLP.CreaTable]
(
    @TableName  VARCHAR(255)
)
AS
BEGIN

    SET NOCOUNT ON

    DECLARE @SQL VARCHAR(4000)
    SET @SQL = 'IF NOT EXISTS ( SELECT  * 
                                FROM    sysobjects 
                                WHERE   id = OBJECT_ID(N''[dbo].' + @TableName + ''') 
                                AND     xtype in (N''U'')) 
                    CREATE TABLE [dbo].[' + @TableName + '](
                        [Serial] [int] NOT NULL,
                        [Marc] [bit] NOT NULL,
                        [Sell] [bit] NOT NULL
) ON [PRIMARY]'

    EXEC (@SQL)
END

答案 3 :(得分:1)

您无法直接使用数字创建表名。尝试将表名放在引号中:I.e。

EXEC [dbo].[TLP.CreaTable] ['100']