Проблема с динамическим запросом

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

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

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.01.2013 18:02:16
При вызове хранимой процедуры нельзя в параметры передавать выражения. Только константы и перменные.

Это я про второй вариант. Первый и третий - не верные в принципе.
Кесарь
Дата: 31.01.2013 18:03:56
Гавриленко Сергей Алексеевич,

а как будет верно?
Glory
Дата: 31.01.2013 18:04:30
Кесарь
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.01.2013 18:04:57
Кесарь
Гавриленко Сергей Алексеевич,

а как будет верно?
Верно правильно написать второй вариант.
Кесарь
Дата: 31.01.2013 18:05:41
Glory
Потому что вы путаете динамический запрос с параметризированным запросом


А можно, чтоб я понял, кусочек кода, как надо?
Гавриленко Сергей Алексеевич
Дата: 31.01.2013 18:07:26
Кесарь
Glory
Потому что вы путаете динамический запрос с параметризированным запросом


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

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

 EXECUTE sp_executesql
 @sql,
 N'@asset2  varchar(100)',
 @asset2 = @asset
Glory
Дата: 31.01.2013 18:08:01
Кесарь
Glory
Потому что вы путаете динамический запрос с параметризированным запросом


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

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

select @sql = 'alter table #result add ND' + @str + ' nvarchar(255) null'
exec(@sql)
Кесарь
Дата: 31.01.2013 18:08:24
Гавриленко Сергей Алексеевич
Верно правильно написать второй вариант.


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

Пжлст:

Прошу вас, напишите как нужно в виде кода.
Гавриленко Сергей Алексеевич
Дата: 31.01.2013 18:08:46
Кесарь
Гавриленко Сергей Алексеевич
Верно правильно написать второй вариант.


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

Пжлст:

Прошу вас, напишите как нужно в виде кода.
Выше написано уже.