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是有风险的。