我正在尝试在导入月度数据集之前验证一些列标题。我已经设置了一个执行SQL任务,它应该检索上个月表的列标题,并将其作为单个字符串存储在 Header_Row 中,字段名称由逗号。查询在SQL Server中运行正常,但在SSIS中运行时,会引发以下错误:
"The type of the value (Empty) being assigned to variable 'User:Header_Row' differs from the current variable type (String)."
1)这是否意味着我从查询中得不到任何回报?
2)我是否应该在SSIS中使用另一种方法来获取我正在寻找的查询结果?
3)我在查询中使用变量引用作为字符串的部分是否存在问题?我认为答案是肯定的,但我想确认一下,因为我的变量在更改之后仍然是空的。
原始查询:
SELECT DISTINCT
STUFF((
SELECT
',' + COLUMN_NAME
FROM
db_Analytics.INFORMATION_SCHEMA.COLUMNS aa
WHERE
TABLE_NAME = 'dt_table_?'
ORDER BY
aa.ORDINAL_POSITION
FOR
XML PATH('')
), 1, 1, '') AS Fields
FROM
db_Analytics.INFORMATION_SCHEMA.COLUMNS a;
编辑:更改变量以覆盖完整的表名后,我有一个新的错误说“值类型(__ComObject)只能转换为Object类型的变量。”
最终查询:
SELECT DISTINCT
CAST(STUFF((
SELECT
',' + COLUMN_NAME
FROM
db_Analytics.INFORMATION_SCHEMA.COLUMNS aa
WHERE
TABLE_NAME = ?
ORDER BY
aa.ORDINAL_POSITION
FOR
XML PATH('')
), 1, 1, '') As varchar(8000)) AS Fields
FROM
db_Analytics.INFORMATION_SCHEMA.COLUMNS a;
答案 0 :(得分:2)
我非常确定这是你的问题:
TABLE_NAME = 'dt_table_?'
我猜这是尝试参数化查询,但在单引号中加上问号将导致问号按字面意思理解。
请尝试这样:
TABLE_NAME = ?
当您填充用作参数值的变量时,请在变量值中包含“dt_table_”部分。
编辑:
同样在ResultSet分配中,尝试在“结果名称”列中将“字段”更改为“0”。
答案 1 :(得分:2)
您正在尝试参数化您的查询。 正确的查询参数化对于避免SQL注入攻击等非常有用。
您的查询正在寻找TABLE_NAME
字面上的'dt_table_?'这可能不是你想要的。
对于懒惰,我只是将其重写为
DECLARE @tname sysname = 'dt_table_' + ?;
SELECT DISTINCT
STUFF((
SELECT
',' + COLUMN_NAME
FROM
db_Analytics.INFORMATION_SCHEMA.COLUMNS aa
WHERE
TABLE_NAME = @tname
ORDER BY
aa.ORDINAL_POSITION
FOR
XML PATH('')
), 1, 1, '') AS Fields
FROM
db_Analytics.INFORMATION_SCHEMA.COLUMNS a;
如果这不起作用,您可能需要使用Expression来构建查询。
答案 2 :(得分:0)
上述查询存在两个问题:
1)任务中的查询未正确参数化。我通过将前一个月的表的全名放入变量来解决这个问题。
2)结果的默认长度为MAX,这导致SSIS尝试将其放入我的变量 Header_Row 时出现问题。我通过将查询结果转换为varchar(8000)来修复此问题。
感谢大家的帮助。