簡體   English   中英

SQL Server 2016批量插入csv並從特定列生成sha1並插入到列中

[英]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)中存在一個字符差異,那么該記錄就是唯一記錄? 在這里定義唯一記錄的目的是什么,當出現“重復”時會發生什么?

在這種情況下,我建議您遵循這種非常常用的暫存模式,最終將其用於大多數數據導入過程

  1. 批量插入沒有PK的登台表
  2. 使用INSERT僅將唯一記錄插入真實表中
  3. 您的真實表具有一個簡單的int身份PK,由於步驟2,在所要求的列上它保證是唯一的
  4. 您可以在登台表中標識有問題的記錄

根據我的實驗,無法在此特定計算字段上創建任何種類的唯一約束/唯一索引/ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM