Sql 如何使用表中的文件名进行BCP查询?

Sql 如何使用表中的文件名进行BCP查询?,sql,bcp,Sql,Bcp,我正在使用BCP将许多blob提取到文件中,并想知道是否有一种方法可以使用SQL表中的ID字段为每个文件指定一个唯一的名称。 这项工作: DECLARE @Command NVARCHAR(4000) SET @Command = 'bcp "SELECT FileData FROM MyDB.dbo.Attachments WHERE Hist_ID = ''00004F13''" queryout "C:\Wha.pd

我正在使用BCP将许多blob提取到文件中,并想知道是否有一种方法可以使用SQL表中的ID字段为每个文件指定一个唯一的名称。 这项工作:

DECLARE  @Command NVARCHAR(4000)  
SET @Command = 'bcp "SELECT FileData FROM MyDB.dbo.Attachments 
                WHERE Hist_ID = ''00004F13''" 
                queryout "C:\Wha.pdf" -T -c -C RAW -S SERVERNAME -U SA -P pa$$word'  
EXEC xp_cmdshell   @Command
但是为了获得文件名,我尝试了:

DECLARE @FileName varchar(50),  
@Command NVARCHAR(4000)  
SET @FileName = Hist_ID+'wha.PDF'  
SET @Command = 'bcp "SELECT FileData FROM MyDB.dbo.Attachments 
                WHERE Hist_ID = ''00004F13''"     queryout'  
SET @Command = @Command + 'C:\' + @FileName + '-T -c -C RAW 
                           -S SERVERNAME -U SA -P pa$$word'  
EXEC xp_cmdshell   @Command
我收到一个错误:列名“Hist_ID”无效。
有没有办法做到这一点?谢谢你的帮助

试试这个。这是我知道的一次只能执行一行的唯一方法

这段代码只是打印命令。取消对xp_cmdshell的注释,使其实际运行。您可能希望首先从一个小样本开始,限制select

DECLARE @Hist_ID VARCHAR(100)
DECLARE @Ext VARCHAR(10)
DECLARE @Command NVARCHAR(4000)  


DECLARE cAttachments CURSOR FOR
SELECT DISTINCT Hist_ID,Extension
FROM MyDB.dbo.Attachments 
ORDER BY Hist_ID

OPEN cAttachments

FETCH NEXT FROM cAttachments
INTO @Hist_ID, @Ext

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @Command = 'bcp "SELECT FileData FROM MyDB.dbo.Attachments 
                WHERE Hist_ID = ''' + @Hist_ID + '''"
                queryout "C:\' + @Hist_ID + '.' + @Ext + '" -T -c -C RAW -S SERVERNAME -U SA -P pa$$word'  

    PRINT @Command

    -- EXEC xp_cmdshell   @Command


    FETCH NEXT FROM cAttachments
    INTO @Hist_ID, @Ext

END

CLOSE cAttachments
DEALLOCATE cAttachments

您需要使用游标遍历MyDB.dbo.Attachments,动态构建SQL并按行执行。有比我更热情的人可能会发布这篇文章,如果没有其他人,我也会发布。如果你能,那就太棒了,尼克!非常感谢。大家好,我迫切需要一个解决方案。我搜索了所有地方,只找到了如何将datetime添加到您的bcp文件名中。提前感谢你能给予的任何帮助。太好了。谢谢你,尼克。这是可行的,但我有两个问题:1。对于某些行,我会收到此错误,因为在将varchar值“0000400B”转换为int.2数据类型时,Hist_ID具有alpha字符:[Microsoft][SQL Server Native Client 10.0][SQL Server]转换失败。我忘了补充一点,我还需要从同一个表中的一列中提取文件扩展名,扩展名会有所不同。我怎样才能将其添加到文件名中?再次感谢。好的,我已经修复了转换错误,并为您的扩展添加了一列。试试看,效果很好!刚刚在FETCH NEXT子句中添加了@Ext-谢谢您的帮助!