2011-06-23 73 views
5

我想創建一個存儲過程其中我想要在表中插入值。 但我不知道在哪個字段中我必須插入值,並且在 運行時我將決定在哪個字段中插入值。 我想要做什麼是作爲INSERT語句中的參數的列名稱

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

能有可能,我通過這種類型的存儲過程中的參數所示在上面的例子??

我想使用條件太作爲

申報@Query爲nvarchar(4000) DECLARE @查詢1爲nvarchar(4000) DECLARE @ParmDefinition爲nvarchar(500);

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

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

我在做什麼錯?

回答

4

這是不可能做的參數。您將需要構建動態查詢來實現此目的。

使用動態SQL的PROC是這樣的:

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 

[編輯]回答你的第二個問題。讓它成爲一個查詢而不是兩個

set @Query = ' 
    if exists(select * from tbl_temp where '+quotename(@ColumnName)+' = @ColumnValue) 
     update tbl_temp set' + quotename(@ColumnName) +' = @ColumnValue, [email protected] 
    else   
     insert into tbl_temp(' + quotename(@ColumnName) +',Description) 
    values (@ColumnValue, @Description)' 
+0

在MVC動作控制器中可以進行動態查詢。如果是,那麼請告訴我如何? – Saloni

+1

@Saloni - 你在哪裏使用MVC,ASP.NET,WinForms或WPF並不重要。只需通過您使用的任何數據訪問調用proc即可。 –

+0

感謝其工作正常 – Saloni