特定行上的Openrowset批量插入

时间:2016-10-17 12:18:35

标签: sql-server

我是SQL的新手,但我正在尝试学习它的逻辑,我假设批量插入将插入所有行,在这种情况下是一个blob。 (pdf文件)下面是我的代码,但我想要完成的是,插入一个我已经放在SQL服务器上的pdf文件,该文件具有我指定的匹配主键。到目前为止,我缺少指定PK的where子句

   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查询而不是插入吗?以及如何删除指定我要插入此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三个选项之一。我喜欢这个更新查询,因为它似乎适合我想要做的事情。

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果您想插入新记录,那么您可以拥有PK的标识列,而不必担心它。我还看到了在PK上设计没有标识的表时使用的函数。类似于选择列表中的GetTableNamePK()。

如果您想更新现有记录,那么您将需要一个如您所述的where子句。这在测试中对我有用:

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

如果你不想使用身份或功能,那么在ID是主键的情况下,我想插入PK为3的BLOB:

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