之前你走這條道路,我強烈建議閱讀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
備註:
- 不要把它當作生產就緒代碼就像存根/起點!
- 你
INSERT
對我來說沒有任何意義,因爲它也應該UPDATE
現有行(插入一個值時會留下領域的休息與NULL/default value
)
- 注意可能
SQL Injection
所以報價標識符,參數多態值
- 檢查如果表/列存在,並且提供的值可以鑄造到其數據類型,如果不添加代碼,將投
@Column_Value
不是每個數據類型都可以從string
- 隱式連鑄機重新使用正常
INSERT INTO