作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我这样做时我没有收到任何错误,但它在我的数据库中创建了一个名为“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
最佳答案
表名不能参数化。因此,您需要动态构建 SQL 语句,将名称合并到动态脚本中。
为了最大限度地降低 SQL 注入(inject)的风险,请使用 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
基本上,动态查询看起来与您当前的查询几乎完全一样。唯一的区别是表名是作为 QUOTENAME(@TABLENAME)
的结果添加的。动态查询的 datetime
参数恰好与存储过程的相应参数同名,但这不是强制性的。
EXECUTE sp_executesql
语句将 datetime
参数传递给动态查询,然后执行它。
另一个注意事项是关于您对 datetime
值使用 BETWEEN
谓词。如果 Transaction_date
包含具有非零时间部分的时间戳,最好以这种形式指定范围:
[Transaction_date] >= @AuditPeriodStartDate
and
[Transaction_date] < @AuditPeriodEndDate
这样您就可以确保结果只包含相关值。可以在这篇博客文章中找到更多信息:
关于sql - 如何在我的 sql 过程中为我的表名使用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19694958/
我是一名优秀的程序员,十分优秀!