2015-11-27 37 views
1
create procedure insert_data 
(@Table-name, 
@column-name, 
@column-value) 
as 
Begin 
...... 
end 

我有了命名爲table-namecolumn-namecolumn-values 3列的DataTable,我想這傳遞給存儲過程。如何數據表列傳遞給存儲過程作爲參數

在存儲過程中,我希望獲取的數據表中的值,我想 創建應該創建一個使用table-namecolumn-namecolumn-valuesdata-table一個INSERT語句 動態SQL。

例子:

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

回答

0

之前你走這條道路,我強烈建議閱讀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
相關問題