2010-01-13 67 views
3

我有一個SQL Server集成服務項目,它使用SQL命令作爲數據訪問模式使用OLE DB源查詢SQL Server 2005數據庫。SQL Server集成服務 - 向SQL語句添加參數

我想參數化我的SQL查詢,但語法不是@PARAM,當我嘗試使用?並點擊參數我得到一個錯誤,說「參數不能從SQL命令中提取」。

我做這樣的事情

SELECT * FROM [dbo].[TabledValuedFunction] (?) 

回答

1

它看起來像OLEDB連接不會與它需要來確定參數的數據類型等,因此它不能正確解析出一切供應SSIS它應該是什麼(這是我的猜想)。由於錯誤消息提示,您可以使整個SQL命令來自一個變量。您需要一個您在數據流之前設置的字符串變量。

+1

我明白了,這似乎有點讓人失望! – AJM 2010-01-13 15:33:02

+0

你知道如果我使用DataReader來源會有更多運氣嗎? – AJM 2010-01-13 15:34:02

+0

我有同樣的想法,並嘗試使用DataReader,根本無法使用參數。如果我找到更好的解決方法,我會讓你知道。 – 2010-01-13 15:38:08

0

您可以在ole db源中使用可變參數來提供動態表,動態條件語句或動態sql語句。通過點擊ole db源,你可以改變數據訪問模式。以下是一些不同類型的訪問模式示例,您可以在其中使用包變量:

參數化表 - 使用表名或視圖名稱變量。然後選擇包含有效表格名稱的變量名稱;

參數化條件語句:使用sql命令。 Sql命令文本將如下所示:Select * From Table where id =?。然後映射你的變量。

變量中的動態sql:使用來自變量的sql命令。然後你可以把你的sql語句放在一個包字符串變量中:Select * From Table

我並不完全確定你想要參數化的東西,所以我給了你一些可能的選項,不幫你解決你的問題。我希望這有幫助。

7

在創建動態SQL語句時,我使用表達式獲得了更好的運氣。所以在這個假設的情況下,我會創建2個變量Qry1和Qry1Param1。

的Qry1變量中我會使用表達式編輯器創造的東西,看起來像

"SELECT * FROM [dbo].[TabledValuedFunction] where tbl_key = " + @[User::Qry1Param1] 

Qry1Param1變量會是這樣的1

這樣Qry1計算結果爲

SELECT * FROM [dbo].[TabledValuedFunction] where tbl_key = 1 

然後你可以改變OLEDB數據源從變量中使用SQL命令的數據訪問模式和用戶:: Qry1輸入變量。

0

你是如何設置你的執行sql任務組件的? 我剛剛嘗試過,它工作正常。

這是我使用的功能:

create function test1(@x int) 
returns @tbl table (x int) 
as begin 
while (@x > 0) 
begin 
    insert @tbl values(@x); 
    set @x-=1; 
end; 

return; 
end; 
go 

This is my ExecSql setting.

在測試了MSSQL2008,SSIS2008。

1

我有這個問題,它讓我瘋狂,有些查詢會工作,而其他人會失敗。我的決議是刪除SELECT *,而是明確指定列。在其他一些查詢中,我必須刪除子查詢。基本上,你必須擺弄/簡化你的查詢,直到OLEDB提供者能夠充分解析呈現參數信息所需的所有信息。

爲什麼OLEDB提供程序不能返回更具描述性的錯誤消息,因此人們不必訴諸包變量解決方法????