2010-08-12 109 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命令'进行动态查询。