我正在研究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并且顺利进行。 感谢
答案 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']