2017-04-20 77 views
0

我試圖在導入每月數據集之前驗證某些列標題。我已經設置了一個執行SQL任務,它應該檢索上個月表格的列標題,並將其作爲單個字符串存儲在Header_Row中,其中字段名稱用逗號分隔。查詢運行就好在SQL Server中,但在SSIS中運行時,它拋出以下錯誤:無法在SSIS中將列名稱變爲變量執行SQL任務

"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

有兩個問題與上面的查詢:

1)在任務查詢不正確的參數。我通過將前一個月的表的全名放入變量中來解決這個問題。

2)結果的默認長度爲MAX,這是導致SSIS時會盡量把它變成我的變量的問題,HEADER_ROW。我通過將查詢結果轉換爲varchar(8000)來解決此問題。

感謝大家的幫助。

2

我真的很肯定這是你的問題:

TABLE_NAME = 'dt_table_?' 

我猜這是參數化查詢的嘗試,但有單引號內的問號將導致字面上的問號。

嘗試這樣來代替:

TABLE_NAME = ? 

當你填入你作爲參數值使用的變量,包括變量的值「dt_table_」的一部分。

編輯:

而且在你的ResultSet分配,嘗試在結果名稱列更改「字段」爲「0」。

+0

我認爲你是對的,它是* a *問題,但不是唯一的問題。當我提到你所做的改變時,我仍然得到錯誤,但是用* DBNull *代替* Empty *。 – grichmer

+0

您可能會遇到以下問題:a)將變量分配給查詢參數和/或b)將查詢結果分配給輸出變量。但是您需要添加這些作業的屏幕截圖,以便我們能夠提供幫助。 –

+0

已添加到帖子。結果集被設置爲單行結果集。 – grichmer

2

您正試圖參數化您的查詢。 適當的查詢參數化對於避免SQL注入攻擊等很有用。

您的查詢正在查找字面上'dt_table_?'的TABLE_NAME。這可能不是你想要的。

懶惰,我只是把它改寫爲

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; 

如果不工作,你可能需要使用表達式來打造出來的查詢。

+0

是的,我不確定SSIS如何解釋*?*的位置。我現在得到了Null,這是*某事*,而不是正確的事情。 – grichmer