插入未知数量的值

时间:2016-05-04 16:11:55

标签: sql-server insert

我有一个表 import_saved_format_det (称之为A)结构如下:

row_id | hdr_id | column_name
1      | 1      | supplier_name
2      | 1      | branch_name
3      | 2      | supplier_name
4      | 2      | branch_name
5      | 2      | barcode

给定 hdr_id column_name 的数量未知但总是5或更少。

我有另一个名为 traxs_temp ..__ SimpleImport_ColumnNames (称之为B)的表,结构如下:

row_id | session_id | field1 | field2 | field3 | field4 | field5

使用field1到field5可为空。

在存储过程中,我想在表B中为给定的 hdr_id 插入来自A的 column_name 。我的问题是我没有&# 39;知道我必须事先插入多少 column_name

这是我到目前为止所做的事情

DECLARE @hdr_id int = 1
DECLARE @session_id varchar(30) = 'test'

DECLARE @list varchar(max) = ''
SELECT @list = @list + '[' + column_name + '],' FROM import_saved_format_det WHERE hdr_id = @hdr_id
SELECT @list = REVERSE(STUFF(REVERSE(@list), 1, 1, ''))

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO traxs_temp..__SimpleImport_ColumnNames
                (session_id, 
                field1, 
                field2, 
                field3, 
                field4,
                field5)
            SELECT 
                @session_id,
                * 
            FROM 
                (
                    SELECT column_name FROM import_saved_format_det WHERE hdr_id = @hdr_id
                ) src PIVOT ( MAX(column_name) FOR column_name IN (' + @list  + ') ) piv;'

EXEC SP_EXECUTESQL @sql, N'@hdr_id int, @session_id varchar(30)', @hdr_id, @session_id

但是我得到 INSERT语句的选择列表包含的项目少于插入列表。

有没有办法将剩余的字段设置为null?或者我认为这是错的?

2 个答案:

答案 0 :(得分:1)

如果我有一个带有Identity的主键,我只能做到这一点。我可以省略列名并执行类似Insert Table1的操作。选择a,b,c从Table2中,Table1有第四列作为主键(Identity)。

我建议在构建@list时确定您拥有的列数,并确定其余列的虚拟值。例如,对于字符字段,您可以使用''''' ...

答案 1 :(得分:0)

感谢 Joe C 的回答,我找到了一种做我想做的事情的方法。在为我的PIVOT构建列表时,我添加了几行,以便根据需要添加尽可能多的虚拟对象。

var response = await client.PostAsJsonAsync(url, arr1);    

因此对于 hdr_id = 2 我得到 [supplier_name],[branch_name],[条形码],[dummy4],[dummy5]