【问题标题】:how to pass datatable column to stored procedure as parameter如何将数据表列作为参数传递给存储过程
【发布时间】:2016-03-01 11:24:51
【问题描述】:
create procedure insert_data
(@Table-name,
@column-name,
@column-value)
as 
Begin 
......
end

我有一个包含 3 列的数据表,分别命名为 table-name、column-name、column-values,我想将其传递给存储过程。

在存储过程中,我想获取数据表值并且我想 创建应创建 INSERT 语句的动态 SQL 使用来自data-table 的table-name、column-name、column-values。

例子:

insert into @table-name(@column-name) values(@column-values)

【问题讨论】:

    标签: sql stored-procedures datatable dynamic-sql


    【解决方案1】:

    在你走这条路之前,我强烈建议阅读The Curse and Blessings of Dynamic SQL。

    您没有指定您使用的 RDBMS,所以我使用 SQL Server 作为示例:

    CREATE TABLE mytable(ID INT IDENTITY(1,1), col1 VARCHAR(100),
                         col2 INT, col3 DATETIME);
    GO
    
    CREATE PROCEDURE [dbo].[insert_data]
        @Table_Name    SYSNAME
       ,@Column_Name   SYSNAME
       ,@Column_Value  NVARCHAR(MAX)
    AS
    BEGIN
       SET NOCOUNT ON;
    
       -- here you should check metadata if table/column exists
       -- you can get also the column datatype and validate with `TRY_PARSE`
    
       SELECT @Table_Name = QUOTENAME(@Table_Name),
              @Column_Name = QUOTENAME(@Column_Name);
    
       DECLARE @sql NVARCHAR(MAX)  =
         N'INSERT INTO @Table_Name(@Column_Name)
           VALUES (@Column_Value);';
    
       SET @sql = REPLACE(@sql, '@Table_Name', @Table_Name);
       SET @sql = REPLACE(@sql, '@Column_Name', @Column_Name);
    
       -- debug
       -- SELECT @sql
    
       EXEC dbo.sp_executesql
              @sql
              ,N'@Column_Value NVARCHAR(MAX)'
              ,@Column_Value;
    END
    GO
    

    调用:

    您可以使用CURSOR/LOOP 从表中读取数据并为每一行调用过程。

    EXEC [dbo].[insert_data] 
       @Table_Name     = 'mytable' 
       ,@Column_Name   = 'col1'
       ,@Column_Value  = 'Text Sample';
    GO
    
    EXEC [dbo].[insert_data] 
       @Table_Name     = 'mytable' 
       ,@Column_Name   = 'col2'
       ,@Column_Value  = '100';
    GO
    
    EXEC [dbo].[insert_data] 
       @Table_Name     = 'mytable' 
       ,@Column_Name   = 'col3'
       ,@Column_Value  = '2015-11-27T00:00:00';
    GO
    

    SqlFiddleDemo

    备注:

    1. 不要将其视为生产就绪代码,就像存根/起点一样!!
    2. 您的INSERT 对我来说没有意义,因为它还应该UPDATE 现有行(一次插入一个值将留下NULL/default value 的其余字段)
    3. 注意可能的 SQL Injection 所以引用标识符,参数化值
    4. 检查表/列是否存在并且提供的值可以转换为它的数据类型,如果不添加将转换@Column_Value的代码不是每个数据类型都可以从string隐式转换
    5. 重新考虑使用普通INSERT INTO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多