Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблемы с sp_executesql  [new]
Testor1
Member

Откуда:
Сообщений: 679
Всем привет

Столкнулся с проблемой использования sp_executesql в процедуре.

Есть код который формирует динамический запрос.

					SET @tsql = N' INSERT INTO ' + @ImportTableName +  N' WITH(TABLOCK) ' + CHAR(10);
					SET @tsql = @tsql + N' SELECT ' + CAST(@FileId AS NVARCHAR(20)) + N', ' +  @DestinationColumns + CHAR(10);
					SET @tsql = @tsql + N' FROM (MERGE #count  WITH(TABLOCK)  t ' + CHAR(10);
					SET @tsql = @tsql + N' USING  (SELECT ' + @SourceColumns + CHAR(10); 
					SET @tsql = @tsql + N' FROM OPENROWSET(BULK ''' + @localPath + @FileName + N''', FORMATFILE = ''' + @FileFormatPath + N''', ERRORFILE=''' + @LogDir + @FileName + N'.log'', ROWS_PER_BATCH=' + CAST(@FileRecords AS NVARCHAR(20)) + N') AS r  LEFT JOIN dbo.tb_ctns_load t ON t.ctn = r.subscriber_id AND t.check_date = @process_date) AS q ON 1 = 0' + CHAR(10);
					SET @tsql = @tsql +	N' WHEN NOT MATCHED BY TARGET THEN' + CHAR(10); 
					SET @tsql = @tsql + N'		INSERT (dummy)  VALUES(1)' + CHAR(10);  
					SET @tsql = @tsql + N' OUTPUT ' + @Output + N') AS m;'  + CHAR(10);
					IF(@Where1 IS NOT NULL)	SET @tsql = @tsql + @Where1 + CHAR(10);



PRINT @tsql;
EXEC sp_executesql @tsql, N'@process_date DATE', @process_date = @process_date;


В результате работы этого блока формируется


 INSERT INTO table1 WITH(TABLOCK) 
 SELECT col1, col2, col3
 FROM (MERGE #count  WITH(TABLOCK)  t 
 USING  (SELECT col1, сol2, col3, id
 FROM OPENROWSET(BULK ''E:\import.csv'', FORMATFILE = ''E:\import.XML'', ERRORFILE=''E:\import.csv.log'', ROWS_PER_BATCH=131468) AS r  LEFT JOIN dbo.tb_for_load t ON t.id = r.col1 AND t.check_date = @process_date) AS q ON 1 = 0
 WHEN NOT MATCHED BY TARGET THEN
		INSERT (dummy)  VALUES(1)
 OUTPUT q.col1, q.col2, q.col3) AS m; 



SQL выдает сообщение об ошибке если запустить его через sp_executesql.
Error 50000, Severity 16, State 1, Procedure usp_sys_RethrowError, Line 36
Invalid column name 'id'.
Msg 50000, Level 16, State 1, Procedure usp_sys_RethrowError, Line 36
Invalid column name 'id'.


Если этот же код скопировать и запустить в отдельном окне с помощью tsql, то все работает.


Не могу понять почему тот же код не работает в процедуре (((
10 июл 13, 10:25    [14545134]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Testor1
Если этот же код скопировать и запустить в отдельном окне с помощью tsql, то все работает.


Не могу понять почему тот же код не работает в процедуре

Потому что ошибка _генерируется_ в Procedure usp_sys_RethrowError, Line 36.
Именно генерируется.
10 июл 13, 10:30    [14545166]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
...
ON t.id = r.col1 
...
И какова структура таблицы #count на момент выполнения кода в хп?
10 июл 13, 10:31    [14545175]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Testor1
Member

Откуда:
Сообщений: 679
pkarklin
...
ON t.id = r.col1 
...
И какова структура таблицы #count на момент выполнения кода в хп?



CREATE TABLE #count (dummy bit);

а это как связано ?

Если вместо SELECT col1, сol2, col3, id написать SELECT col1, сol2, col3 то все работает
10 июл 13, 10:33    [14545186]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Testor1
Member

Откуда:
Сообщений: 679
Сузил поиск

Блок кода из процедуры usp_procedure2
Если ее вызвать, то все работает корректно.

Только при вызове usp_procedure2 из usp_procedure1 возникает такая ситуевина.

usp_procedure1 ни как не может повлиять на значение переменных в usp_procedure2

Почему так происходит ?
10 июл 13, 11:04    [14545431]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Testor1
Сузил поиск

Блок кода из процедуры usp_procedure2
Если ее вызвать, то все работает корректно.

Только при вызове usp_procedure2 из usp_procedure1 возникает такая ситуевина.

usp_procedure1 ни как не может повлиять на значение переменных в usp_procedure2

Почему так происходит ?
#count в какой процедуре создаётся?
А до вызова внешней процедуры таблица с таким именем существует?
10 июл 13, 11:09    [14545482]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
что-то вы недоговариваете.
в коде формирования запроса у вас жестко забито:

LEFT JOIN dbo.tb_ctns_load t ON t.ctn = r.subscriber_id


а формируется, по вашим словам:

LEFT JOIN dbo.tb_for_load t ON t.id = r.col1 


это как же так?
10 июл 13, 11:17    [14545548]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Testor1
Member

Откуда:
Сообщений: 679
daw,

Разобрался :( Отбой. Моя вина.
Для формирования динамического скл, я часть данных загружаю из настроечной таблицы. Внес в справочник еще одно поле.
Та процедура, что я привел, отрабатывает коррект. Следующая процедура также подгружает данные из этого справочника. Вот она и ругалась :( Про этот нюанс я забыл. Когда запускал основной модуль (процедуру), та не показывала в какой именно процедуре ошибка
10 июл 13, 11:22    [14545587]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить