我有这个问题:
将@company声明为varchar(20); 将@query声明为varchar(500); 选择@ company =公司名称; set @ query ='SELECT [名称] ,[地址] FROM ['+ @company +'$ Customer]'
exec(@query)
它可以在SQL Server中成功运行并返回8行,但是当我复制该查询并将其粘贴到SSIS OLE DB Source中时,它显示了一条警告消息 “SQL命令没有返回列信息”
是否因为SSIS OLE DB无法执行多个选择命令,如下所示:
选择@ company =公司名称
选择 [名称] ,[地址] FROM ['+ @company +'$ Customer]
请告知
由于
答案 0 :(得分:0)
我猜这是因为你正在寻找多个行集,来自$ Customer,b $ Customer等,对吧?据我所知,OLEDB源只提供一个行集。
一种解决方案是使用Script组件作为源;在那里,你将执行你的第一个查询来获取公司列表,循环遍历它,并获取每个公司的名称/地址记录列表,将整个批次添加到输出。
Simpler可能是控制流中的执行SQL任务,您可以在其中获取公司表的列表。然后用foreach来粉碎它,每次一个表处理一个数据流。您在foreach中设置了一个变量,并使用它在数据流源组件中构建动态SQL。
干杯, 杰夫
编辑:回应:
我忘了告诉你这个 select语句“select @ company = Name 来自公司“只返回1行。
由于您在Company表中只有一条记录,只需使用执行SQL任务将其选择为变量,然后在您的数据流中将OLEDB源设置为“来自变量的SQL命令”。你需要一个变量来保存构造的SQL命令;它应该工作。
答案 1 :(得分: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包变量?
答案 2 :(得分:0)
尝试在ssis中使用'来自变量的SQL命令'进行动态查询。