我有一个带有非自动增量ID字段的表。我需要创建一个varchar数组,然后将数组中的数据插入表中。
问题是我不知道如何声明这样的数组。而且我也不知道如何通过循环中的索引来寻址值。
declare @newCodesList - ???
declare @counter int = 0
declare @lastID int = (select MAX(Id) from OrganizationCode)
while @counter < LEN(@newCodesList)
begin
@lastID = @lastID + 1
insert into OrganizationCodeCopy values(@lastID, @newCodesList[@counter])
@counter = @counter + 1
end
在代码上部,我尝试在找到最后一个记录ID并声明计数器之后在循环中插入值
答案 0 :(得分:1)
可以使用逗号分隔的字符串代替数组。如下所示:
DECLARE @newCodesList VARCHAR(MAX) = 'value1,value2'
DECLARE @lastID int = (SELECT MAX(Id) FROM OrganizationCode)
INSERT INTO OrganizationCodeCopy
(
Id,
Code
)
SELECT
@lastID + ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Id
Element AS Code
FROM
asi_SplitString(@newCodesList, ',')
答案 1 :(得分:1)
使用循环不是一个好的解决方案。您可以尝试定义一个临时表并使用一条语句插入新数据。 Id
的值是通过ROW_NUMBER()
函数生成的:
-- New data
CREATE TABLE #NewCodes (
Code varchar(50)
)
INSERT INTO #NewCodes
(Code)
VALUES
('Code1'),
('Code2'),
('Code3'),
('Code4'),
('Code5'),
('Code6')
-- Last ID
DECLARE @LastID int
SELECT @LastId = (SELECT ISNULL(MAX(Id), 0) FROM OrganizationCode)
-- Statement
INSERT INTO OrganizationCode
(Id, Code)
SELECT
@LastId + ROW_NUMBER() OVER (ORDER BY Code) AS Id,
[Code]
FROM #NewCodes
答案 2 :(得分:1)
您可以使用表变量来存储代码。然后从该变量执行INSERT ... SELECT
。要获取ID,您可以使用row_number()
来自其他表的最大ID。
DECLARE @codes TABLE
(code nvarchar(4));
INSERT INTO @codes
(code)
VALUES ('A01B'),
('B03C'),
('X97K');
INSERT INTO organizationcodecopy
(id,
code)
SELECT (SELECT coalesce(max(id), 0)
FROM organizationcode) + row_number() OVER (ORDER BY code) id,
code
FROM @codes;