在你走这条路之前,我强烈建议阅读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