Имя столбца как параметр в инструкции INSERT - PullRequest
5 голосов
/ 23 июня 2011

Я хочу создать одну хранимую процедуру , где я хочу вставить значения в таблицу. Но я не знаю, в какое поле я должен вставить значения и на во время выполнения я решу, в какое поле следует вставить значения . Что я хочу сделать, это

insert into Tablename(@ColumnName, Description) 
values (@ColumnValue, @MH_Description)

Возможно ли передать этот тип параметров в хранимой процедуре, как показано в примере выше?

Я тоже хочу использовать условия как

объявить @Query nvarchar (4000) объявить @ Query1 nvarchar (4000) объявить @ParmDefinition nvarchar (500);

set @Query = '
    insert into tbl_temp(' + quotename(@ColumnName) +',Description)

    values (@ColumnValue, @Description)'
    set @Query1 = '
    update tbl_temp set' + quotename(@ColumnName) +'=@ColumnValue, Description=@Description'
set @ParmDefinition = N'@ColumnValue varchar(100),@Description varchar(100)'
if exists(select 'true' from tbl_temp where quotename(@ColumnName)=@ColumnValue)
begin         
  exec sp_executesql @Query1, @ParmDefinition, @ColumnValue = @ColumnValue, @Description = @Description
end
else 
begin      exec sp_executesql @Query, @ParmDefinition, @ColumnValue= @ColumnValue, @Description = @Description
end

Что я делаю не так?

1 Ответ

5 голосов
/ 23 июня 2011

Это невозможно сделать с параметрами. Вам нужно будет построить динамический запрос для достижения этого.

Процесс, использующий динамический SQL, будет выглядеть так:

create procedure MyProc
(
    @ColumnName varchar(100),
    @ColumnValue varchar(100),
    @MH_Description varchar(100)
)
as
begin
    declare @Query nvarchar(4000)
    declare @ParmDefinition nvarchar(500);

    set @Query = '
        insert into Tablename(' + quotename(@ColumnName) +',Description) 
        values (@ColumnValue, @MH_Description)'
    set @ParmDefinition = N'@ColumnValue varchar(100), @MH_Description varchar(100)'
    exec sp_executesql @Query, @ParmDefinition, @ColumnValue = @ColumnValue, @MH_Description = @MH_Description
end

[EDIT] Ответ на второй вопрос. Сделайте один запрос вместо двух

set @Query = '
    if exists(select * from tbl_temp where '+quotename(@ColumnName)+' = @ColumnValue)
        update tbl_temp set' + quotename(@ColumnName) +' = @ColumnValue, Description=@Description
    else        
        insert into tbl_temp(' + quotename(@ColumnName) +',Description)
    values (@ColumnValue, @Description)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...