【问题标题】:SQL Server : insert stored procedure with dynamic table nameSQL Server:使用动态表名插入存储过程
【发布时间】:2017-01-26 00:35:50
【问题描述】:

我正在尝试创建一个用于插入新数据的存储过程。基本上我收到关于“声明表变量@tablename”的错误。

我试过了:

create procedure [dbo].[spInsertProc](@table_name varchar(max))
as
begin
    declare @name nvarchar(128);
    declare @description nchar(255);
    declare @tablename varchar(max);
    --declare @tablename as table;

    set @tablename = @table_name;

    Insert Into @tablename ([name], [description])
    Values (@name, @description)
end

另一个问题是这个存储过程是安全的,因为我没有使用查询字符串,对吧?

【问题讨论】:

  • 不能在任何sql语句中使用变量作为表名。

标签: c# sql-server stored-procedures


【解决方案1】:

准备动态插入语句如下:

CREATE procedure [dbo].[spInsertProc](@table_name varchar(max))
as
begin
  declare @name varchar(50)='Sandip';
  declare @description varchar(50)='SE'; 

  Declare @Query VARCHAR(MAX)
  SET @Query='Insert Into '+@table_name+' ([name], [description])
    Values (
       '''+@name+''',
        '''+@description+''')'
  EXEC(@Query);
  PRINT(@Query); 
end

【讨论】:

  • 我不赞成你提倡一种容易受到 SQL 注入黑客攻击的方法
【解决方案2】:

这是使用带有列和参数的插入语句创建存储过程的动态查询

DECLARE @table_name varchar(255) = 'table_name'
  DECLARE @v_col varchar(MAX)
  DECLARE @v_param varchar(MAX)
  DECLARE @SP_param varchar(MAX)
  DECLARE @sp_type varchar(10) = 'Insert'

    SET @v_col = STUFF(
                 (SELECT ',' + '['+c.name+']'
                 FROM sys.tables t  JOIN sys.columns c ON t.object_id = c.object_id
                            WHERE t.name = @table_name
                            AND c.is_identity = 0
                     FOR XML PATH ('')), 1, 1, ''
                        )
    SET @v_param =  STUFF(
                     (SELECT ',' + '@'+c.name
                     FROM sys.tables t  JOIN sys.columns c ON t.object_id = c.object_id
                            WHERE t.name = @table_name
                            AND c.is_identity = 0
                     FOR XML PATH ('')), 1, 1, ''
                        )

    SET @SP_param = STUFF(
                     (SELECT ',' + '@'+c.name+' '+y.name+' '+(CASE WHEN y.name = 'varchar' THEN '('+CAST(c.max_length as varchar)+')' ELSE '' END)
                     FROM sys.tables t  JOIN sys.columns c ON t.object_id = c.object_id
                     JOIN sys.types y ON y.user_type_id = c.user_type_id
                            WHERE t.name = @table_name
                            AND c.is_identity = 0
                     FOR XML PATH ('')), 1, 1, ''
                        )
  Declare @Query VARCHAR(MAX)
  DECLARE @SPQuery VARCHAR(MAX)
  SET @SPQuery = 'CREATE PROCEDURE '+@sp_type+''+@table_name+' ('+@SP_param+')
  AS BEGIN'
  SET @Query='Insert Into '+@table_name+' ('+@v_col+')
    Values (
        '+@v_param+')
        END'


  PRINT(@SPQuery); 
  PRINT(@Query); 

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多