2012-10-18 152 views
0

我有一個存儲過程用於從SQL表中提取二進制數據以創建物理文件。我已經在使用從SQL備份恢復的相同結構的表上多次使用過它,並且它工作正常。列名無效:SQL Server 2008 R2

今天我想從恢復備份中的新表中提取一些二進制數據。我打開了我一直使用的存儲過程並設置了更改代碼。一旦我對更改感到滿意,我嘗試執行'ALTER'語句。不幸的是,儘管存在於「文檔」表中,但我使用的兩個列名都是「無效的」。

我已經閱讀了許多關於'無效列名'錯誤的其他線索,但其中大部分似乎都是輸入錯誤。我檢查了我的列名numurous次(智能感甚至讓我把'Document.Document_ID'和'Document.Document_Filename',但他們仍然失敗)。

任何想法我錯了嗎?

來源:

USE [Example Live] 
GO 
/****** Object: StoredProcedure [dbo].[FileExport] Script Date: 10/18/2012 11:42:14 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Chris Murray 
-- Create date: 18/10/2012 
-- Description: Exports binary file data 
-- ============================================= 
ALTER PROCEDURE [dbo].[FileExport] 
-- Add the parameters for the stored procedure here 
@OutputFilePath VARCHAR(500) = 'C:\Conv\Example\In\Afiles\' 
AS 
BEGIN 

    DECLARE @totrow int 
    DECLARE @currow int 
    DECLARE @result int 
    DECLARE @nsql nvarchar(4000) 

    DECLARE @sqlStatements table (ID int IDENTITY(1, 1), SqlStatement varchar(max)) 

    INSERT 
    INTO @sqlStatements 
    SELECT 'BCP "SELECT Document_Data FROM [Example Live].[dbo].[Document] WHERE Document_ID = ''' 
    + CAST(Document_ID AS VARCHAR(500)) + '''" queryout ' + @OutputFilePath 
    + CAST(Document_Filename AS VARCHAR(500)) + ' -S localhost\SQLEXPRESS2008 -T -f C:\Conv\Example\In\AFiles\Images.fmt' 
    FROM dbo.Photograph 

    SET @totrow = @@ROWCOUNT 
    SET @currow = 1 
    WHILE @totrow > 0 and @currow <= @totrow 
    BEGIN 
     SELECT @nsql = SqlStatement 
     FROM @sqlStatements 
     WHERE ID = @currow 
     EXEC @result = xp_cmdshell @nsql 
     SET @currow = @currow + 1 
    END 
END 
+0

您是否嘗試過在列名稱周圍放置[]?這應該處理任何使用保留字的列名稱。 –

+0

我已經嘗試過了,仍然沒有運氣。 我發現我從來沒有提過這部分導致錯誤: CAST(DOCUMENT_ID爲varchar(500))和 CAST(Document_Filename爲varchar(500)) – ChrisMurray

+0

嘗試使用此代碼生成的SQL語句和SQL Management Studio中執行它。你確定你的BCP命令連接到正確的數據庫嗎? –

回答

0

感謝您的想法大家。

這個問題是我自己製造的,也是一個菜鳥的錯誤。我忽略了將SELECT語句指向正確的表格。