我不会详述这个要求的原因(太长且不相关)。
我有一个相当宽的表Table_1
,包含256列,全部为NVARCHAR(512)
并接受空。
另一方面,我有一个字符串,其中构建了动态选择,并且根据具体情况,它每次生成不同数量的列。
查询结果需要插入Table_1
。
问题是我要么明确提到要插入结果的列,要么查询的结果必须与目标表的结构匹配。
例如,让我们:
DECLARE @Table_1 TABLE (Field_1 NVARCHAR(512) ,
Field_2 NVARCHAR(512) ,
Field_3 NVARCHAR(512) ,
Field_4 NVARCHAR(512) ,
Field_5 NVARCHAR(512) ,
Field_6 NVARCHAR(512) ) ;
和查询一样:
DECLARE @_My_Query NVARCHAR(1000) = '
SELECT Name Field_1 ,
Street Field_2 ,
Phone Field_3
FROM My_Table
';
现在,我无法做到:
INSERT INTO @Table_1
EXECUTE sp_executesql @_My_Query ;
因为它会抱怨列不匹配。我也不能对(Field_1,Field_2,Field_3)
进行硬编码,因为其他查询需要不同数量的列。
KrazzyNefarious,Jeroen Mostert和Damien_The_Unbeliever发表的评论的答案:
我对查询返回的字段及其计数有清晰的了解。
我试图实现的功能如下:
我正在处理的系统应该支持生成具有可变数量的列和内容的CSV文件。
这个想法是生成结果数据的查询在更高层准备并发送到存储过程(作为字符串)以及描述结果的所有列的表(例如序数位置) ,字段名称,数据类型,Excel第一行中的标题等。)
我正在处理的程序将获取查询字符串并运行合并的INSERT INTO Table_1 EXECUTE sp_executesql @_My_Query
。完成此操作后,检查每个字段的机制(例如,在需要时添加"
)可以处理Table_1的内容,而无需担心数据的来源。
我宁愿避免使用临时表,因为除了方法的丑陋之外,它还会影响性能和其他问题(需要在使用后删除记录,冲突等)。
答案 0 :(得分:-1)
这:
我正在研究的系统应该支持生成具有可变数量的列和内容的CSV文件。
是你问题的症结所在。您选择的路径并不真正匹配/支持此要求。你已经排除了临时表。所以唯一的另一个选择是为每个导出“情况”创建一个(临时或永久)表 - 这是丑陋的,容易出现很多其他问题。因为rdbms中的表具有固定的结构。不仅仅是不同数量的列,还需要考虑不同的数据类型。你是否也忽略了这个问题,或者你做了一个非常简化的假设?如果你只看一种情况,你往往会忽视你所面临的复杂性。
此外,您还可以搜索有关从存储过程(或脚本)导出CSV数据的许多讨论。即使没有源数据结构的可变性,它也只是问题和约束的嵌套。
我建议您使用错误的工具来实现您的要求。 TSQL根本不是故意的,并不真正支持ETL。如果你想沿着这条路走下去,你将需要一些高级技能。