当前位置: 首页 > 面试题库 >

列名作为INSERT语句中的参数

解晟
2023-03-14
问题内容

我想创建一个 存储过程 ,我想在表中插入值。但是我不知道我必须在哪个字段中插入值,而在 运行时,我将决定应在哪个字段中插入值 。我想做的是

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

我究竟做错了什么?


问题答案:

这与参数是不可能的。您将需要html" target="_blank">构建动态查询来实现此目的。

使用动态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, Description=@Description
    else        
        insert into tbl_temp(' + quotename(@ColumnName) +',Description)
    values (@ColumnValue, @Description)'


 类似资料:
  • 我有一个SSIS包,它有一个Execute SQL任务,其中有一个INSERT语句,它将日志数据插入到跟踪执行时间的smss中的SSIS跟踪表中。每次尝试执行任务时,都会出现以下错误:[execute SQL task]错误:执行查询“INSERT INTO DBO.ssis_logging_details(execution_in...”失败,错误为:“必须声明标量变量”@execguid“。”

  • 问题内容: 假设我想要一个表来记录其他表中的日期和列数(或者实际上是任何种类的数学/字符串concat等)。 每当执行插入操作时,是否可以为我计算计数列? 例如做类似的事情: 并具有由mysql计算的计数。 显然,我可以自己做一个查询来获取计数并插入计数,但是这样做会更好。 问题答案: 当通过插入,更新或删除表来更改数据时,触发器是注释数据的最佳工具。 要使用当前日期自动将日志中新行的日期列设置为

  • 问题内容: 为什么不能将表名传递给准备好的PDO语句? 还有另一种安全的方法可以将表名插入SQL查询吗?有了安全,我的意思是我不想做 问题答案: 表名和列名不能用PDO中的参数替换。 在这种情况下,您只需要手动过滤和清理数据。一种实现方法是将简写参数传递给将动态执行查询的函数,然后使用一条语句创建要用于表名或列名的有效值白名单。这样,就不会有用户输入直接进入查询。因此,例如: 通过不保留默认大小写

  • 问题内容: 我在SQL表中有一些列,例如text_en,text_es,text_de。现在,我只想根据语言从一列中检索值。因此,我创建了一个sql字符串, 并在vb代码中使用了 sql,但是sql返回了该列的名称,而不是该列的值。我如何获得价值? 问题答案: 你也可以

  • 主要内容:1.不指定列名,2.通过指定列名称SQL INSERT语句用于在表中插入单个或多个数据。 在SQL中,可以通过以下两种方式插入数据: 不指定列名称 通过指定列名称 假设有一个表: 的结构和数据记录如下 - EMP_ID EMP_NAME CITY SALARY AGE 1 Angelina Chicago 200000 30 2 Robert Austin 300000 26 3 Christian Denver 100000 4

  • 主要内容:语法,实例,使用一个表来填充另一个表SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。 语法 INSERT INTO 语句有两种基本语法,如下所示: 在这里,column1, column2,...columnN 是要插入数据的表中的列的名称。 如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。SQLite 的 INSERT INTO