Sql server 插入未知数量的值
我有一个表导入\保存\格式\数据(称为a),结构如下: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
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]我不理解人们不写评论就投反对票。什么值得在这里投否决票?感谢最后一段,它帮助我找到了解决问题的方法。我很高兴我能提供帮助,这个网站已经帮助我很多次了。