SQL Server 2008 R2:具有一个或多个表名和一个参数的存储过程

SQL Server 2008 R2:具有一个或多个表名和一个参数的存储过程,sql,sql-server,stored-procedures,sql-server-2008-r2,Sql,Sql Server,Stored Procedures,Sql Server 2008 R2,我使用此存储过程来存档给定表中超过给定天数的数据: CREATE PROCEDURE [dbo].[sp_util_archive_test] @days int, @table_name nvarchar(64) AS BEGIN TRY BEGIN TRANSACTION DECLARE @archive_table varchar(128), @src_table varchar(128); SET @src_table = @table_

我使用此存储过程来存档给定表中超过给定天数的数据:

CREATE PROCEDURE [dbo].[sp_util_archive_test] 
    @days int, @table_name nvarchar(64)
AS
BEGIN TRY
BEGIN TRANSACTION
    DECLARE @archive_table varchar(128),
            @src_table varchar(128);
    SET @src_table = @table_name;
    SET @archive_table = @table_name + '_archive';

    DECLARE @dropSQL nvarchar(max) = 'DROP TABLE ' + @archive_table;

    IF OBJECT_ID(@archive_table, 'U') IS NOT NULL
      EXEC (@dropSQL);

    DECLARE @sqlCommand nvarchar(1000)
    DECLARE @date varchar(75)
    SET @sqlCommand = 'Select * into [' + @archive_table + ']  from  [' + @src_table + '] WHERE date <= dateadd(d, -' + CAST(@days AS varchar(16)) + ', getdate())'
    EXECUTE sp_executesql @sqlCommand

  COMMIT
END TRY
BEGIN CATCH
  ROLLBACK
  DECLARE @Msg nvarchar(max)
  SELECT
    @Msg = ERROR_MESSAGE();
  RAISERROR ('Error Occured: %s', 20, 101, @Msg) WITH LOG;
END CATCH
创建过程[dbo]。[sp\u util\u archive\u test]
@天数int,@table_name nvarchar(64)
作为
开始尝试
开始交易
声明@archive_table varchar(128),
@src_表varchar(128);
设置@src\u table=@table\u name;
设置@archive\u table=@table\u name+“\u archive”;
声明@dropSQL nvarchar(max)=“DROP TABLE”+@archive\u TABLE;
如果对象ID(@archive\U table,'U')不为空
EXEC(@dropSQL);
声明@sqlCommand-nvarchar(1000)
声明@date varchar(75)

将@sqlCommand='Select*从['+@src_table+']设置为['+@archive_table+'],其中date忽略注射风险;您可以将带分隔符的字符串传递到一个参数中,然后为每个参数循环执行现有存储过程的结果

e、 g.@param=‘表1 |表2 |表3 |表4’

在“|”上拆分 循环查看所有结果,并为每个结果执行SP


拆分示例:

忽略注射风险;您可以将带分隔符的字符串传递到一个参数中,然后为每个参数循环执行现有存储过程的结果

e、 g.@param=‘表1 |表2 |表3 |表4’

在“|”上拆分 循环查看所有结果,并为每个结果执行SP


拆分示例:

为什么要将其复杂化?使用多个作业步骤或在单个步骤中放置多行:

EXEC [dbo].[sp_util_archive_test] 50, 'table1';
EXEC [dbo].[sp_util_archive_test] 70, 'table2';
EXEC [dbo].[sp_util_archive_test] 80, 'table3';
EXEC [dbo].[sp_util_archive_test] 10, 'table4';

为什么要把它复杂化?使用多个作业步骤或在单个步骤中放置多行:

EXEC [dbo].[sp_util_archive_test] 50, 'table1';
EXEC [dbo].[sp_util_archive_test] 70, 'table2';
EXEC [dbo].[sp_util_archive_test] 80, 'table3';
EXEC [dbo].[sp_util_archive_test] 10, 'table4';

听起来您需要一个表参数,然后在游标中使用它。但是如果我通过
talbeName];删除表用户--到您当前的过程中?我正在存档的表是日志表,除了7天的数据之外,这些表不值得维护,因此我不关心此上下文中的用户注意:您不应该在存储过程中使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!你要更加明目张胆,这是SQL注入的风险。使用动态SQL是有风险的。听起来您需要一个表参数,然后在游标中使用它。但是如果我通过
talbeName];删除表用户--到您当前的过程中?我正在存档的表是日志表,除了7天的数据之外,这些表不值得维护,因此我不关心此上下文中的用户注意:您不应该在存储过程中使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!你要更加明目张胆,这是SQL注入的风险。拥有动态SQL是有风险的。