2016-10-17 28 views
2

我是SQL新手,但正在嘗試學習其邏輯,我假設批量插入將插入所有行,在這種情況下是blob。 (pdf文件)是我的代碼,但我想要完成的是,插入一個PDF文件,我把SQL服務器放在一個具有我指定的匹配主鍵的行中。到目前爲止我缺少where子句來指定PK在特定行上的Openrowset批量插入

Declare @sql varchar(max) 
    Declare @filePath varchar(max) 
    Set @filePath = 'C:\iphone.pdf' 
    Set @sql='INSERT INTO HDData.dbo.PurchasedCellPhoneInfo(Receipt) SELECT * FROM OPENROWSET(BULK '''+ @filePath+''', SINGLE_BLOB) AS BLOB' 
    exec(@sql) 

我可以使用更新的t-SQL查詢而不是insert嗎?以及如何刪除我要插入此Blob的特定行的位置? 任何幫助,將不勝感激。

我也曾經嘗試這樣做,下面的@ misterPositive的建議爲更新查詢:

Declare @criteria varchar(50) 
SET @criteria ='352014075399147' 
UPDATE HDData.dbo.PurchasedCellPhoneInfo SET Receipt = 
(SELECT Receipt FROM OPENROWSET (BULK 'C:\352014075399147.pdf, SINGLE_BLOB') a) 
WHERE(IMEI = @criteria) 

我這樣做收到此消息: 無論是格式文件或三個選項之一SINGLE_BLOB,SINGLE_CLOB,或SINGLE_NCLOB必須指定。我喜歡這個更新查詢,因爲它似乎適合我試圖做什麼。

+0

這是使用SQL Server嗎? –

回答

2

你可以做到這一點,以更新:

UPDATE MyTable 
SET blobField = 
    (SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a) 
WHERE (CriteriaField = @criteria) 

這裏是PK

CREATE VIEW [dbo].[VWWorkDataLoad] 
AS 
SELECT RecordLine 
FROM [dbo].[WorkDataLoad]; 

另一種方式現在BULK INSERT應該再像:

BULK INSERT [dbo].[VWWorkDataLoad] FROM 'D:\NPfiles\TS082114.trn' 
WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n'); 
+1

只要不是身份,您可以指定PK。至少在2014年,我還沒有測試過其他版本。 –

+0

謝謝MisterPositive!我相信這對我有用,先生,我看到一串長字符我會嘗試檢索它並查看文檔。但是我將不得不做一些研究並且解決一些疑問,謝謝! – Edgar

0

如果你想插入新記錄,然後你可以爲你的PK有一個標識列,而不必擔心它。我還看到了一個桌子在PK上沒有標識的情況下使用的功能。類似於選擇列表中的GetTableNamePK()。

如果你想更新現有的記錄,那麼你會希望你提到一個where子句。這在測試工作對我來說:

Update TestBlob Set BinaryData = (SELECT * FROM OPENROWSET(BULK 'c:\temp\test.pdf', SINGLE_BLOB) AS BLOB) 
    Where ID = 2 

如果你不想使用Identity或功能這個工作,在那裏ID是一個主鍵,我想插入帶有3 PK的BLOB:

INSERT INTO TestBlob2 (ID, BinaryData) SELECT 3, * FROM OPENROWSET(BULK 'c:\temp\test.pdf', SINGLE_BLOB) AS BLOB