[英]SQL Server 2016 bulk insert csv and generate sha1 from specific columns and insert into a column
我對SQL Server還是相當陌生,並且正在c#應用程序內部運行以下命令:
DECLARE @SQLString nvarchar(4000);
SET @SQLString = N'BULK INSERT events FROM '+ QUOTENAME(@p0) +' WITH ( BATCHSIZE = 50000, CODEPAGE = ''65001'', FIELDTERMINATOR = ''|'', ROWTERMINATOR =''\n'' )'
EXECUTE sp_executesql @SQLString
@ p0是.csv文件的路徑。
現在,我將從C#代碼中3列的組合中生成一個sha1 HashCode作為BigInteger,並將其寫入csv文件中的新列(這是主鍵)中。
現在,我看到可以在sql服務器內部生成sha1哈希。 批量插入時有可能嗎?
例如,批量插入csv文件。 對於每一行,取列X,Y,Z並生成sha1哈希。 將其轉換為BigInteger並將其插入P列?
編輯:我正在嘗試從@ Nick.McDermaid的答案:但我似乎無法使其工作:
CREATE TABLE [dbo].[test] (
[User] [nvarchar](185) NOT NULL,
[Stat] [nvarchar](25) NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[HashByte] AS (convert(bigint, HASHBYTES('SHA1',CONVERT(nvarchar(max),[User]+[Stat]+[Name])))),
CONSTRAINT [PK_dbo.test] PRIMARY KEY ([HashByte]))
錯誤語法錯誤。
我建議您退后一步:首先:您是說如果varchar(max)字段(2Gb)中存在一個字符差異,那么該記錄就是唯一記錄? 在這里定義唯一記錄的目的是什么,當出現“重復”時會發生什么?
在這種情況下,我建議您遵循這種非常常用的暫存模式,最終將其用於大多數數據導入過程
根據我的實驗,無法在此特定計算字段上創建任何種類的唯一約束/唯一索引/ PK
步驟1和步驟2的一些示例代碼為:
-- Bulk insert into staging table
BULK INSERT staging.events FROM.....
-- Only insert records from staging that aren't already there
INSERT INTO dbo.events (User,Stat,Name)
SELECT User,Stat,Name
FROM staging.events S
WHERE NOT EXISTS (
SELECT * FROM dbo.events E
WHERE E.User = S.User
AND E.Stat = S.Stat
AND E.Name = S.Name
)
現在,如果您願意,可以將另一個更新寫回到標識重復項的登台表中。
確實回到了“重復”的含義。 如果您的“ Name
列中有一個字符差異,那是重復的嗎?
我明白了
CREATE TABLE dbo.test (
[User] nvarchar(185) NOT NULL,
[Stat] nvarchar(25) NOT NULL,
[Name] nvarchar(max) NOT NULL,
[HashByte] AS CAST(HASHBYTES('SHA1', CONCAT([User],[Stat],[Name])) AS BIGINT)
PERSISTED, CONSTRAINT [PK_dbo.test] PRIMARY KEY ([HashByte]) )
然后使用no_dup_keys!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.