Sql-Server

如何將 varchar 值列表插入到單列表中?

  • October 28, 2020

在 SQL Server 2005 中:

CREATE TABLE __RADHE
(
   itemNo varchar(10) not null primary key clustered
);
GO

INSERT INTO __RADHE ???

'34926840', '34927020', '34927202', '34927384', '34927566',
'34927830', '34927889', '34930743', '34930750', '34927897',
'34927848', '34927574', '34927392', '34927210', '34927038',
'34926857', '34917120', '34917286', '34917443', '34926865',
'34927046', '34927228', '34927400', '34927582', '34927855',
'34927905', '34930768', '34930776', '34927913', '34927863',
'34927590', '34927418', '34927236', '34927053', '34926873',
'34917450', '34917294', '34917138', '34917146', '34917302',
'34917468', '34926881', '34927061', '34927244', '34927426',
'34927608', '34927871', '34927921', '34930784', '34927616',
'34927434', '34927251', '34927079', '34926899', '34917476',
'34917310', '34917153', '34917161', '34917328', '34917484',
'34926907', '34927087', '34927269', '34927442', '34927624',
'34927632', '34927459', '34927277', '34927095', '34926915',
'34917492', '34917336', '34917179', '34917187', '34917344',
'34917500', '34926923', '34927103', '34927285', '34927467',
'34927640', '34927657', '34927475', '34927293', '34927111',
'34926931', '34917518', '34917351', '34917195', '34917203',
'34917369', '34917526', '34926949', '34927129', '34927301',
'34927483', '34927665', '34927673', '34927491', '34927319',
'34927137', '34926956', '34917534', '34917377', '34917211',
'34917229', '34917385', '34917542', '34926964', '34927145',
'34927327', '34927509', '34927681', '34927699', '34927517',
'34927335', '34927152', '34926972', '34917559', '34917393',
'34917237', '34917245', '34917401', '34917567', '34926980',
'34927160', '34927343', '34927525', '34927707', '34927715',
'34927533', '34927350', '34927178', '34926998', '34917575',
'34917419', '34917252', '34917260', '34917427', '34917583',
'34927004', '34927186', '34927368', '34927541', '34927723',
'34927731', '34927558', '34927376', '34927194', '34927012',
'34917591', '34917435', '34917278', '34916577', '34916676',
'34933861', '34933879', '34929315', '34916684', '34916585',
'34909861', '34909879', '34916593', '34916692', '34929323',
'34933887', '34933895', '34929331', '34916700', '34916601',
'34909887', '34909895', '34916619', '34916718', '34929349',
'34933903', '34933911', '34929356', '34916726', '34916627',
'34909903', '34909911', '34916635', '34916734', '34929364',
'34933929', '34933937', '34929372', '34916742', '34916643',
'34909929', '34909937', '34916650', '34916759', '34929380',
'34933945'

我怎樣才能完成這項工作?

由於您使用的是 SQL Server 2005,因此您需要為每個值執行一次插入。升級到 SQL Server 2012 或更高版本,您將獲得 multipleVALUES子句,這讓這變得更加容易。

就像是:

INSERT INTO __RADHE (ItemNo)
VALUES ('34933945');

我建議使用 find-and-replace 將逗號替換為所需的語法。

將上面值列表中的逗號替換為:

); INSERT INTO __RADHE (itemNo) VALUES (

似乎讓你幾乎一直到那裡。

作為旁白; 在引用對象時,您應該始終指定架構。指定時PRIMARY KEY CLUSTERED,您將隱式創建一個約束,如果您不指定名稱,SQL Server 將為其命名。如果您不喜歡類似於 的名稱,請指定一個名稱PK__T1__3214EC27023D5A04

例如,你的CREATE TABLE陳述應該是這樣的:

CREATE TABLE dbo.[__RADHE]
(
   itemNo VARCHAR(10) NOT NULL 
       CONSTRAINT PK___RADHE
       PRIMARY KEY CLUSTERED
);

如果源數據有可能包含重複條目,您可能會發現延遲創建主鍵約束直到插入數據並刪除重複項更容易。為此,請創建如下表:

CREATE TABLE dbo.[__RADHE]
(
   itemNo VARCHAR(10) NOT NULL 
);

INSERT INTO ...然後使用上述語句插入所有行。

執行此命令以刪除重複項:

;WITH src AS (
   SELECT r.*
       , rn = ROW_NUMBER() OVER (PARTITION BY r.itemNo ORDER BY r.itemNo)
   FROM dbo.__RADHE r
)
DELETE
FROM src
WHERE rn > 1;

然後創建主鍵約束:

ALTER TABLE dbo.__RADHE
ADD CONSTRAINT pk__RADHE
PRIMARY KEY CLUSTERED
(itemNo);

作為旁注,除非您TABLOCKX在表上使用鎖定提示,否則所有行都使用我上面詳述的UNION ALL方法或單獨方法單獨記錄。INSERT INTO如果您可以在插入期間通過 鎖定整個表TABLOCKX,那麼只會記錄頁面分配,從而大大減少發生的日誌記錄量。說了這麼多,當然有很多“陷阱”可能會阻止批量記錄頁面 - 正如 Paul White在此處詳述的那樣。

引用自:https://dba.stackexchange.com/questions/116178