2

我正在开发一个 SSIS 包。我有一个包含名称列表的数组。这些名称将是表名。

为了创建这些表,我循环一个 SQL 任务编辑器执行一个接受参数(表名)的存储过程

存储过程的代码:

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

4 回答 4

3

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

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

编辑:将表名括在方括号中也可能是一个想法,以防它是保留字:

CREATE TABLE [dbo].[' + QuoteName(@TableName) + '] (
于 2012-04-13T12:04:45.877 回答
2

尝试使用'表名

EXEC dbo.[TLP.CreaTable] '[3001]'
于 2012-04-13T12:04:35.067 回答
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
于 2012-04-13T12:05:40.297 回答
1

您不能直接使用数字创建表名。尝试将表名放在引号中:即

EXEC [dbo].[TLP.CreaTable] ['100']
于 2012-04-13T12:06:25.580 回答