【问题标题】:Dynamic SQL Error - Set value to a parameter动态 SQL 错误 - 为参数设置值
【发布时间】:2016-03-13 10:34:26
【问题描述】:

我有一个动态 sql。

declare @CustomerId int
set @CustomerId = 1
declare @SDate datetime 
set @SDate = '2015/12/07'
declare @ItemId int
set @ItemId = 2

declare @QtyS nvarchar(max)
declare @QtyOut decimal(18,3)

set @QtyS = 'SELECT isnull(sum(d.Qty),0)
FROM InvoiceDetail AS d INNER JOIN
InvoiceHeader AS h ON d.InvoiceNo = h.InvoiceNo
where
h.CustomerId = '''+@CustomerId+''' and
d.itemmasterid = '''+@ItemId+''' and
h.Deleted = 0 and
h.invoicedate = '''+@SDate+''''

exec sp_executesql @QtyS, N'@Qty decimal(18,3) out', @QtyOut out
select @QtyOut

执行此附加错误时。 错误作为文本也附于此。 有什么想法吗?

Error:
Msg 245, Level 16, State 1, Procedure rpt_SpecialLaunch, Line 76
Conversion failed when converting the varchar value 'SELECT isnull(sum(d.Qty),0)
    FROM InvoiceDetail AS d INNER JOIN
    InvoiceHeader AS h ON d.InvoiceNo = h.InvoiceNo
    where
    h.CustomerId = '' to data type int.

【问题讨论】:

  • 请将错误添加为文本
  • 在连接之前将非字符串变量转换为字符串:'xxx' + cast(@CustomerId as varchar(16)) + ' xxx' - 你所拥有的可以在线执行。

标签: sql sql-server sql-server-2005 dynamic-sql


【解决方案1】:
DECLARE
      @CustomerId INT = 1
    , @ItemId INT = 2
    , @SDate DATETIME = '2015/12/07'
    , @QtyS NVARCHAR(MAX)
    , @QtyOut DECIMAL(18,3)

SET @QtyS = '
SELECT @QtyOut = SUM(d.Qty)
FROM dbo.InvoiceDetail d
JOIN dbo.InvoiceHeader h ON d.InvoiceNo = h.InvoiceNo
WHERE h.CustomerId = @CustomerId
    AND d.itemmasterid = @ItemId
    AND h.Deleted = 0
    AND h.invoicedate = @SDate'

EXEC sp_executesql @QtyS,
                   N'@CustomerId INT, @ItemId INT, @SDate DATETIME, @QtyOut decimal(18,3) out',
                   @CustomerId = @CustomerId, @ItemId = @ItemId, @SDate = @SDate, @QtyOut = @QtyOut OUT

SELECT @QtyOut

必须声明标量变量“@QtyS”

DECLARE
      @CustomerId INT = 1
    , @ItemId INT = 2
    , @SDate DATETIME = '2015/12/07'
    , @QtyS NVARCHAR(MAX)
    , @QtyOut DECIMAL(18,3)

SET @QtyS = '
SELECT @QtyOut = 1
SELECT @CustomerId, @ItemId, @SDate'

EXEC sp_executesql @QtyS,
                   N'@CustomerId INT, @ItemId INT, @SDate DATETIME, @QtyOut decimal(18,3) out',
                   @CustomerId = @CustomerId, @ItemId = @ItemId, @SDate = @SDate, @QtyOut = @QtyOut OUT

SELECT @QtyOut

2005 年:

DECLARE
      @CustomerId INT
    , @ItemId INT
    , @SDate DATETIME
    , @QtyS NVARCHAR(MAX)
    , @QtyOut DECIMAL(18,3)

SELECT
      @CustomerId = 1
    , @ItemId = 2
    , @SDate = '2015/12/07'

SET @QtyS = '
SELECT @QtyOut = SUM(d.Qty)
FROM dbo.InvoiceDetail d
JOIN dbo.InvoiceHeader h ON d.InvoiceNo = h.InvoiceNo
WHERE h.CustomerId = @CustomerId
    AND d.itemmasterid = @ItemId
    AND h.Deleted = 0
    AND h.invoicedate = @SDate'

EXEC sp_executesql @QtyS,
                   N'@CustomerId INT, @ItemId INT, @SDate DATETIME, @QtyOut DECIMAL(18,3) OUT',
                   @CustomerId = @CustomerId, @ItemId = @ItemId, @SDate = @SDate, @QtyOut = @QtyOut OUT

SELECT @QtyOut

【讨论】:

  • 必须声明标量变量“@QtyS”。
  • 命令成功完成...语法没有任何问题
  • 选择@@version ?只需提供一个结果,我会检查
  • Microsoft SQL Server 2005 - 9.00.5000.00 (X64) 2010 年 12 月 10 日 10:38:40 版权所有 (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) o​​n Windows NT 5.2 (Build 3790) : 服务包 2)
  • 你用 2008 标记了问题 ;) 好的... 5 分钟
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2013-04-28
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多