2010-08-12 132 views
0

我有這個疑問:SQL Server集成服務2008 OLE DB源

聲明@company爲varchar(20); 將@query聲明爲varchar(500); select @ company =公司名稱; 集@查詢= 'SELECT [名] ,[地址] FROM [' + @company + '$客戶]'

的exec(@query)

它可以在SQL Server成功地運行, 8行返回,但是當我複製該查詢並將其粘貼到SSIS OLE DB源中時,它顯示一條警告消息 「沒有列信息是由SQL命令返回的」

是因爲SSIS OLE DB無法執行不止一個選擇命令就像這樣:

選擇@公司=從公司

SELECT [名] ,[地址] FROM [ '+ @company +' $客戶]名稱

請告知

感謝

回答

0

我想這是因爲你正在尋找多個行集,從$ Customer,b $ Customer等等,對吧?就我所知,OLEDB源將只提供一個行集。

一個解決方案是使用腳本組件作爲源代碼;在那裏,您將執行第一個查詢以獲取公司列表,循環訪問公司,並獲取每個公司的名稱/地址記錄列表,然後將全部內容添加到輸出中。

簡單可能是控制流中的執行SQL任務,您可以在其中獲取公司表的列表。然後是一個foreach碎片,每次處理一個表的數據流。您可以在foreach中設置一個變量,並使用它在數據流源組件中構建動態SQL。

乾杯, 傑夫

編輯:響應:

我忘了告訴你,這 select語句 「選擇@公司=姓名 從公司」 只返回1行。

既然你只有在公司表中的記錄,只需選擇到使用執行SQL任務的變量,然後在您的數據流量設定您的OLEDB源「從變量SQL命令」。你需要一個變量來存放構造的SQL命令;它應該工作。

+0

我忘了通知你,這個選擇語句 「select @ company = Name from Company」 只返回1行。所以如果我連接@company變量到這個語句 「SELECT [Name],[Address] FROM ['+ @company +'$ Customer]」 我想這沒什麼錯。但是OLE DB Source仍然給出了一條警告信息「沒有列信息被SQL命令返回」。你能告訴我,我的查詢有什麼問題嗎? – Michael 2010-08-13 03:42:44

0

如果您使用第一個SELECT語句來設置變量值,那麼即使有多個select語句,它也不會導致問題。我只是跑下面的測試代碼:

運行之前構建的數據流

CREATE TABLE dbo.Company (Name VARCHAR(20) NOT NULL, Address VARCHAR(20) NULL) 
INSERT INTO dbo.Company (Name, Address) 
SELECT 'Test A', 'A' 
UNION 
SELECT 'Test B', 'B' 
UNION 
SELECT 'Test C', 'C' 
UNION 
SELECT 'Test D', 'D' 
UNION 
SELECT 'Test E', 'E' 
UNION 
SELECT 'Test F', 'F' 
UNION 
SELECT 'Test G', 'G' 
UNION 
SELECT 'Test H', 'H' 

運行在數據流中的OLE DB源

declare @company as varchar (20); 
declare @query as nvarchar (500); 

select @company = Name 
from dbo.Company; 

set @query = 'SELECT [Name] ,[Address] FROM dbo.Company WHERE Name IN (''Test A'', ''Test B'')'; 

EXEC sp_executeSQL @query; 

此輸出正確的2行沒有任何問題。你確定你的數據流代碼是正確的嗎?你是否試圖在SQL代碼中使用SSIS包變量?

0

嘗試在ssis中使用'來自變量的SQL命令'進行動態查詢。