SQL Server - Insert语句中的动态列数

时间:2017-11-13 11:40:14

标签: sql-server dynamic-sql

我不会详述这个要求的原因(太长且不相关)。

我有一个相当宽的表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发表的评论的答案:

我对查询返回的字段及其计数有清晰的了解。

我试图实现的功能如下:

  1. 我正在处理的系统应该支持生成具有可变数量的列和内容的CSV文件。

  2. 这个想法是生成结果数据的查询在更高层准备并发送到存储过程(作为字符串)以及描述结果的所有列的表(例如序数位置) ,字段名称,数据类型,Excel第一行中的标题等。)

  3. 我正在处理的程序将获取查询字符串并运行合并的INSERT INTO Table_1 EXECUTE sp_executesql @_My_Query。完成此操作后,检查每个字段的机制(例如,在需要时添加")可以处理Table_1的内容,而无需担心数据的来源。

  4. 我宁愿避免使用临时表,因为除了方法的丑陋之外,它还会影响性能和其他问题(需要在使用后删除记录,冲突等)。

1 个答案:

答案 0 :(得分:-1)

这:

我正在研究的系统应该支持生成具有可变数量的列和内容的CSV文件。

是你问题的症结所在。您选择的路径并不真正匹配/支持此要求。你已经排除了临时表。所以唯一的另一个选择是为每个导出“情况”创建一个(临时或永久)表 - 这是丑陋的,容易出现很多其他问题。因为rdbms中的表具有固定的结构。不仅仅是不同数量的列,还需要考虑不同的数据类型。你是否也忽略了这个问题,或者你做了一个非常简化的假设?如果你只看一种情况,你往往会忽视你所面临的复杂性。

此外,您还可以搜索有关从存储过程(或脚本)导出CSV数据的许多讨论。即使没有源数据结构的可变性,它也只是问题和约束的嵌套。

我建议您使用错误的工具来实现您的要求。 TSQL根本不是故意的,并不真正支持ETL。如果你想沿着这条路走下去,你将需要一些高级技能。