2014-10-31 3 views
0

Я немного застреваю ... Я пытаюсь извлечь результат из запроса и разбить его на многочисленные файлы по одному критерию. Я получаю сообщение об ошибке преобразования типа varchar в int, и я не могу понять, почему. Работа в SQL Server 2008 ...ВЫВОД НА МНОЖЕСТВЕННЫЕ ФАЙЛЫ ОТ ОДИНОЧНОГО QUERY

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, дайте мне знать содержимое каждого файла. Например, LOOP = '1' будет означать, что файл содержит записи клиентов, ассоциированные с LIST_ID = '1'

Мысли об ошибке?

+0

SET @ FILENAME = 'QUERYOUT C: \ Projects \ FILE_ "' + CAST (@LOOP AS VARCHAR) + '. TXT' – DMason

ответ

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='[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.Change VARCHAR (макс) на VARCHAR (8000)
2.Add DBNAME.SCHEMA для всех таблиц, так как по умолчанию он будет указывать на мастер дб.
Добавлены двойные кавычки (") ниже
3. @ FILENAME = 'QUERYOUT " C: \ Projects \ FILE _'. + Cast (@LISTID AS Varchar) + TXT " -c -t - T»
4. '(" ВЫБОР CUSTOMER_NO от клиента А, В, где DATA_TABLE A.CUSTOMER_ID = B.CUSTOMER_ID И A.STATUS = '' 2 '' И LIST_ID =' + @ LISTID + ")'

Смежные вопросы