Rub*_*eia 2 sql sql-server stored-procedures
我这样做时没有出现任何错误,但它在我的数据库中创建了一个名为"dbo.@ tablename"的表,当我真正想要它创建我作为exec过程中的参数传递的值时表名.我究竟做错了什么.这是我的更新程序脚本.也许我可以改变,以便它确实创建值作为表名.
这是我到目前为止:
ALTER PROCEDURE [dbo].[Load_Negatives]
-- Add the parameters for the stored procedure here
@TABLENAME SYSNAME,
@AuditPeriodStartDate datetime,
@AuditPeriodEndDate datetime
AS
BEGIN
SET NOCOUNT ON;
Select
Location,
Customer,
Transaction_date
into
dbo.[@TABLENAME]
from dbo.CustomerHistory (nolock)
where
[Transaction_date] between @AuditPeriodStartDate and @AuditPeriodEndDate
END
Run Code Online (Sandbox Code Playgroud)
表名不能参数化.因此,您需要动态构建SQL语句,并将名称合并到动态脚本中.
要最小化SQL注入的风险,请使用QUOTENAME带有@TABLENAME值的系统函数,并将参数化引入动态查询以传递存储过程的其他两个参数:
ALTER PROCEDURE [dbo].[Load_Negatives]
@TABLENAME SYSNAME,
@AuditPeriodStartDate datetime,
@AuditPeriodEndDate datetime
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql nvarchar(max);
SET @sql = N'Select
Location,
Customer,
Transaction_date
into
dbo.' + QUOTENAME(@TABLENAME) + N'
from dbo.CustomerHistory (nolock)
where
[Transaction_date] between @AuditPeriodStartDate and @AuditPeriodEndDate'
;
EXECUTE sp_executesql
@sql,
N'@AuditPeriodStartDate datetime, @AuditPeriodEndDate datetime',
@AuditPeriodStartDate, @AuditPeriodEndDate
;
END
Run Code Online (Sandbox Code Playgroud)
基本上,动态查询看起来几乎与您当前的查询完全相同.唯一的区别是表名被添加为结果QUOTENAME(@TABLENAME).datetime动态查询的参数恰好与存储过程的相应参数具有相同的名称,但这不是必需的.
该EXECUTE sp_executesql语句将datetime参数传递给动态查询,然后执行它.
另一个注意事项是关于您使用值的BETWEEN谓词datetime.如果Transaction_date包含具有非零时间部分的时间戳,则以这种形式指定范围会好得多:
[Transaction_date] >= @AuditPeriodStartDate
and
[Transaction_date] < @AuditPeriodEndDate
Run Code Online (Sandbox Code Playgroud)
这样,您可以确保结果仅包含相关值.更多信息可以在这篇博客文章中找到:
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |