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='+@LOOP+');

SET @FILENAME='QUERYOUT C:\Projects\FILE_"'+@LOOP+'.TXT'

WHILE @COUNTER<=@LOOP
BEGIN
SELECT 
@BCP='BCP "'+@SQL+'+'+@FILENAME+''
SET @COUNTER=@COUNTER+1
END
GO

私が得ているエラーは次のとおりです。

Msg 245, Level 16, State 1, Line 10
Conversion failed when converting the varchar value '+@LOOP+' to data type int.

LOOP 値を使用して、各ファイルの内容を知らせようとしています。たとえば、LOOP='1' は、LIST_ID='1' に関連付けられた顧客レコードがファイルに含まれていることを意味します。

エラーについての考え?

4

2 に答える 2

0

必要なものを正確に理解しているかどうかはわかりませんが、すべてのBCPコマンドを発行したい場合はLIST_ID、それらをループしてそれぞれに対して実行する必要があります。

これはあなたが必要としているものではないかもしれませんが、私が仕事から家に帰るまで待つのではなく、今投稿します.

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='+@LISTID+')';
    SELECT @BCP='BCP '+@SQL+' '+@FILENAME+''
    EXEC xp_cmdshell @BCP
    FETCH NEXT FROM cur INTO @LISTID
END

CLOSE cur    
DEALLOCATE cur
于 2014-10-31T16:02:50.343 に答える