Sql server 插入未知数量的值

Sql server 插入未知数量的值,sql-server,insert,Sql Server,Insert,我有一个表导入\保存\格式\数据(称为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 row_id | session_id | field1 | field2 | f

我有一个表导入\保存\格式\数据(称为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
row_id | session_id | field1 | field2 | field3 | field4 | field5
给定hdr_id的列名称数未知,但始终小于等于5

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

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
row_id | session_id | field1 | field2 | field3 | field4 | field5
字段1到字段5可为空

在存储过程中,我想为表B中给定的hdr_id插入a中的列名称。我的问题是,我不知道必须预先插入多少列名称

以下是我到目前为止所做的

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语句的select列表包含的项目比INSERT列表少。


有没有办法将剩余字段设置为空?或者我的想法是错误的?

只有当我有一个带有标识的主键时,我才能这样做。我可以省略列名,然后执行类似于插入表1的操作,从表2中选择a、b、c,其中表1有第四列,它是主键(标识)

我建议在构建@list时,确定有多少列,并为其余列附加虚拟值。例如,对于可以附加在“”上的字符字段,“”…

多亏了Joe C的回答,我找到了一种实现我想要的方法。在构建PIVOT列表时,我又添加了几行,以根据需要添加尽可能多的假人

DECLARE @list varchar(max) = ''
SELECT @list = @list + '[' + column_name + '],' FROM import_saved_format_det WHERE hdr_id = @hdr_id
SELECT @fields_count = LEN(@list) - LEN(REPLACE(@list, ',', ''))
SELECT @list = @list + '[dummy' + CONVERT(varchar, range.x) + '],' FROM (VALUES(1),(2),(3),(4),(5)) range(x) WHERE range.x BETWEEN @fields_count + 1 AND 5 
SELECT @list = REVERSE(STUFF(REVERSE(@list), 1, 1, ''))

因此,对于hdr_id=2,我得到了[供应商名称],[分支机构名称],[条形码],[dummy4],[dummy5]

我不理解人们不写评论就投反对票。什么值得在这里投否决票?感谢最后一段,它帮助我找到了解决问题的方法。我很高兴我能提供帮助,这个网站已经帮助我很多次了。