2014-10-31 51 views
0

我有點卡住了...我試圖從查詢中獲取輸出並根據單個條件將其分解成多個文件。我收到一個varchar類型轉換爲int的錯誤,我找不到原因。在SQL Server 2008中的工作...從單個查詢輸出到多個文件

DECLARE @LOOP AS INT; 
DECLARE @SQL AS VARCHAR(MAX); 
DECLARE @BCP AS VARCHAR(MAX); 
DECLARE @COUNTER AS INT; 
DECLARE @FILENAME AS VARCHAR(MAX); 

SET @COUNTER='1' 

SELECT @LOOP = COUNT(DISTINCT LIST_ID) FROM DATA_TABLE 
WHERE STATUS='2' AND LIST_ID IS NOT NULL ; 

SET @SQL=(SELECT CUSTOMER_NO FROM CUSTOMER A, DATA_TABLE B 
WHERE A.CUSTOMER_ID=B.CUSTOMER_ID AND A.STATUS='2' AND LIST_ID='[email protected]+'); 

SET @FILENAME='QUERYOUT C:\Projects\FILE_"'[email protected]+'.TXT' 

WHILE @COUNTER<[email protected] 
BEGIN 
SELECT 
@BCP='BCP "'[email protected]+'+'[email protected]+'' 
SET @[email protected]+1 
END 
GO 

我得到的錯誤是:

Msg 245, Level 16, State 1, Line 10 
Conversion failed when converting the varchar value '[email protected]+' to data type int. 

我試圖使用循環值,讓我知道每個文件的內容。例如,LOOP ='1'意味着該文件包含與LIST_ID ='1'相關聯的客戶記錄。

關於錯誤的想法?

+0

SET @ FILENAME ='QUERYOUT C:\ Projects \ FILE_「'+ CAST(@LOOP AS VARCHAR)+'。TXT' – DMason 2014-10-31 15:57:00

回答

0

我不確定我完全理解你需要什麼,但是如果你想爲每個LIST_ID發出BCP命令,你需要循環它們併爲每一個執行。

這可能不是你所需要的,而不是等到我下班回家後我纔會發佈它。

DECLARE @FILENAME AS VARCHAR(MAX); 
DECLARE @LISTID INT 
DECLARE @LOOP AS INT; 
DECLARE @BCP AS VARCHAR(MAX); 
DECLARE @SQL AS VARCHAR(MAX); 

DECLARE cur CURSOR FOR SELECT DISTINCT LIST_ID FROM DATA_TABLE WHERE STATUS='2' AND LIST_ID IS NOT NULL 
OPEN cur 

FETCH NEXT FROM cur INTO @LISTID 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SET @FILENAME='QUERYOUT C:\Projects\FILE_'+Cast(@LISTID AS Varchar)+'.TXT -c -t -T' 
    SET @SQL='(SELECT CUSTOMER_NO FROM CUSTOMER A, DATA_TABLE B WHERE A.CUSTOMER_ID=B.CUSTOMER_ID AND A.STATUS=''2'' AND LIST_ID='[email protected]+')'; 
    SELECT @BCP='BCP '[email protected]+' '[email protected]+'' 
    EXEC xp_cmdshell @BCP 
    FETCH NEXT FROM cur INTO @LISTID 
END 

CLOSE cur  
DEALLOCATE cur 
0

1.更改爲varchar(最大值)爲varchar(8000)
2.增加DBNAME.SCHEMA爲所有的表,因爲默認情況下它會指向主數據庫。
加雙引號(「)表示
3. @ FILENAME ='QUERYOUT C:\項目\ FILE _ '+角色(@LISTID爲VARCHAR)+' TXT -c -t - T」
4. '( SELECT CUSTOMER_NO FROM CUSTOMER A,DATA_TABLE乙WHERE A.CUSTOMER_ID = B.CUSTOMER_ID AND A.STATUS = '' 2 '' AND LIST_ID = '+ @ LISTID +' )' ;