动态SQL错误-将值设置为参数

动态SQL错误-将值设置为参数,sql,sql-server,sql-server-2005,dynamic-sql,Sql,Sql Server,Sql Server 2005,Dynamic Sql,我有一个动态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 Inv

我有一个动态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.


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

2005年:


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

2005年:


请将错误添加为文本在连接之前将非字符串变量转换为字符串:
'xxx'+cast(@CustomerId as varchar(16))+'xxx'
-您所拥有的可以在行中执行供参考。请将错误添加为文本在连接之前将非字符串变量转换为字符串:
'xxx'+cast(@CustomerId as varchar(16))+'xxx'
-您所拥有的可以在线执行,仅供参考。必须声明标量变量“@QtyS”。命令已成功完成。。。syntaxselect@@version中没有任何问题?请提供一个结果,我将检查Microsoft SQL Server 2005-9.00.5000.00(X64)2010年12月10日10:38:40版权所有(c)1988-2005 Windows NT 5.2上的Microsoft Corporation标准版(64位)(构建3790:Service Pack 2)您用2008标记了问题;)好啊5必须声明标量变量“@QtyS”。命令已成功完成。。。syntaxselect@@version中没有任何问题?请提供一个结果,我将检查Microsoft SQL Server 2005-9.00.5000.00(X64)2010年12月10日10:38:40版权所有(c)1988-2005 Windows NT 5.2上的Microsoft Corporation标准版(64位)(构建3790:Service Pack 2)您用2008标记了问题;)好啊5分钟
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
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
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