我有一个表 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?或者我认为这是错的?
答案 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]