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

Откуда:
Сообщений: 677
Коллеги, помогите пжлст, нужно сварганить код, который выдаст динамический набор столбцов. Со сбором данных проблем нет, а вот их компоновка в итоговый вид вызвала затруднения.

Вот кусочек кода, который никак не хочет заработать:

create table #result (id int identity, data varchar(255) null)
insert into #result select 'Asset'

declare @str nvarchar(5), @sql varchar(255), @asset varchar(100)
select @str = '1', @asset = 'ffff'

select @sql = 'alter table #result add ND' + @str + ' nvarchar(255) null'
exec(@sql)

select @asset = 'ffff'


Вот до этого месты всё было хорошо, я сумел добавить динамическое поле в таблу. А дальше затык. Мне нужно ессно залить данные, а проапдейтить не получается:

1. Такой вариант "работает", но не срабатывает, т.е. в таблице ничего не меняется, но ошибок нет

EXECUTE sp_executesql
 N'update #result set @column = @asset2 where id = 1',
 N'@asset2 varchar(100), @column varchar(5)',
 @asset2 = @asset, @column = 'ND1'



2. Выдаёт ошибку: "Incorrect syntax near '+'."

 EXECUTE sp_executesql
 N'update #result set ND' + @str + ' = @asset2 where id = 1',
 N'@asset2  varchar(100)',
 @asset2 = @asset



3. Этот, вариант первого, вообще непонятное: "String or binary data would be truncated. The statement has been terminated."

EXECUTE sp_executesql
 N'update #result set @column = @asset2 where id = 1',
 N'@asset2 varchar(100), @column varchar(5)',
 @asset2 = 'dddddd', @column = 'ND1'



И как быть? Почему alter table принимает динамическое название столбца, а update ни в какую? Что я делаю не так? Задрал это динамический sql уже до немогу (точнее конечно нежно любимая фирма Microsoft).
31 янв 13, 18:00    [13858491]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
При вызове хранимой процедуры нельзя в параметры передавать выражения. Только константы и перменные.

Это я про второй вариант. Первый и третий - не верные в принципе.

Сообщение было отредактировано: 31 янв 13, 18:02
31 янв 13, 18:02    [13858511]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Кесарь
Member

Откуда:
Сообщений: 677
Гавриленко Сергей Алексеевич,

а как будет верно?
31 янв 13, 18:03    [13858521]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кесарь
1. Такой вариант "работает", но не срабатывает, т.е. в таблице ничего не меняется, но ошибок нет

Разумеется, потому что здесь - set @column = @asset2 - нет ни одного поля таблицы

Кесарь
2. Выдаёт ошибку: "Incorrect syntax near '+'."

Разумеется. Потому что параметрами процедуры не могут быть выражения

Кесарь
3. Этот, вариант первого, вообще непонятное: "String or binary data would be truncated. The statement has been terminated."

И что тут непонятного ?

Кесарь
Почему alter table принимает динамическое название столбца, а update ни в какую?

Потому что вы путаете динамический запрос с параметризированным запросом
31 янв 13, 18:04    [13858525]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Кесарь
Гавриленко Сергей Алексеевич,

а как будет верно?
Верно правильно написать второй вариант.
31 янв 13, 18:04    [13858533]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Кесарь
Member

Откуда:
Сообщений: 677
Glory
Потому что вы путаете динамический запрос с параметризированным запросом


А можно, чтоб я понял, кусочек кода, как надо?
31 янв 13, 18:05    [13858542]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Кесарь
Glory
Потому что вы путаете динамический запрос с параметризированным запросом


А можно, чтоб я понял, кусочек кода, как надо?

set @sql =  N'update #result set ND' + @str + ' = @asset2 where id = 1'

 EXECUTE sp_executesql
 @sql,
 N'@asset2  varchar(100)',
 @asset2 = @asset
31 янв 13, 18:07    [13858555]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кесарь
Glory
Потому что вы путаете динамический запрос с параметризированным запросом


А можно, чтоб я понял, кусочек кода, как надо?

Так, как вы делали alter

select @sql = 'alter table #result add ND' + @str + ' nvarchar(255) null'
exec(@sql)
31 янв 13, 18:08    [13858561]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Кесарь
Member

Откуда:
Сообщений: 677
Гавриленко Сергей Алексеевич
Верно правильно написать второй вариант.


Вам нравиться, чтобы вас просили?

Пжлст:

Прошу вас, напишите как нужно в виде кода.
31 янв 13, 18:08    [13858570]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Кесарь
Гавриленко Сергей Алексеевич
Верно правильно написать второй вариант.


Вам нравиться, чтобы вас просили?

Пжлст:

Прошу вас, напишите как нужно в виде кода.
Выше написано уже.
31 янв 13, 18:08    [13858576]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Кесарь
Member

Откуда:
Сообщений: 677
О, уже вижу примеры, спсб, щас буду пробовать.
31 янв 13, 18:09    [13858580]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Кесарь
Member

Откуда:
Сообщений: 677
Гавриленко Сергей Алексеевич

set @sql =  N'update #result set ND' + @str + ' = @asset2 where id = 1'

 EXECUTE sp_executesql
 @sql,
 N'@asset2  varchar(100)',
 @asset2 = @asset


Вспомнил, я так пробовал изначально, выдавало ошибку (и на ваш код тоже выдаёт её же):

"Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'."
31 янв 13, 18:14    [13858623]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ну так измените тип переменной @sql.
31 янв 13, 18:15    [13858629]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кесарь
"Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'."

Вы сообщения принципиально не читаете ? А только постите дальше ?
31 янв 13, 18:16    [13858635]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Кесарь
Member

Откуда:
Сообщений: 677
Спсб.
31 янв 13, 18:17    [13858642]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Кесарь,


Коллеги, помогите пжлст, нужно сварганить код, который выдаст динамический набор столбцов. Со сбором данных проблем нет, а вот их компоновка в итоговый вид вызвала затруднения.


Мужик, у тебя с головой что-то не так.
А именно— нет в этой твоей голове реляционного мышления.

Таблица или набор данных — это тебе не иксель, у него фиксированное число полей.

Так что базовые вещи прокачивай в этом плане.
31 янв 13, 20:36    [13859237]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Расскажи лучше, пока не поздно, зачем тебе понадобилось переменное число полей в таблице.
31 янв 13, 20:41    [13859250]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Кесарь,

Список столбцов временной таблицы вы можете получить например так...

select replace(
	(
		select name+',' as 'data()'
		from tempdb.sys.columns
		where object_id = object_id('tempdb..#result','U')
		order by column_id
		for xml path('')
	)+'[]',',[]','')


Ну и, насколько я вижу, вам не нужны выходные параметры, можно пользоваться не sp_executesql а просто exec (разница в том, что в 1м случае строка типа nvarchar(4000), во 2м - nvarchar(max) ). Входные параметры можно склеить на этапе формирования строки в виде констант...
1 фев 13, 09:41    [13860308]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Алексей Куренков
можно пользоваться не sp_executesql а просто exec (разница в том, что в 1м случае строка типа nvarchar(4000), во 2м - nvarchar(max) )

В sp_executesql с таким же успехом можно передать динамический SQL размера nvarchar(max).
1 фев 13, 10:19    [13860422]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с динамическим запросом  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Гость333,

Вы правы, с ошибку в раннем коде сейчас пересмотрел - извиняюсь за некорректный совет, sp_executesql работает с nvarchar(max) нормально ))
1 фев 13, 13:30    [13861638]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить