无法在SSIS中将列名称变为变量执行SQL任务

时间:2017-04-20 18:12:20

标签: sql ssis

我正在尝试在导入月度数据集之前验证一些列标题。我已经设置了一个执行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;

3 个答案:

答案 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)来修复此问题。

感谢大家的帮助。