我正在尝试在存储过程中执行sp_executesql
。当我执行存储过程时,它会抛出以下错误
Msg 8114,Level 16,State 5,Line 0
时出错
将数据类型varchar转换为int
我无法弄清楚错误发生的地方
这是我的存储过程
ALTER PROCEDURE [dbo].[spHoldTransaction]
@RegisterNo INT,
@StoreID INT,
@Department VARCHAR(50),
@TransactionDateFrom DATE,
@TransactionDateTo DATE,
@Comment VARCHAR(50)
AS
BEGIN
DECLARE @DatabaseName VARCHAR(15);
IF (@StoreID = 5555)
BEGIN
SET @DatabaseName = 'xxx'
END
SET @Department=''''+REPLACE(@Department,',',''',''')+''''
DECLARE @HoldEntryQry NVARCHAR(MAX);
DECLARE @HoldEntryParamDefinition NVARCHAR(MAX);
SET @HoldEntryParamDefinition = N'@Department VARCHAR(50),@StoreID INT,@NewId INT,@TransactionDateFrom DATETIME,@TransactionDateTo DATETIME'
DECLARE @NewId INT;
SET @NewID = 15;
SET @HoldEntryQry = 'SELECT te.StoreID, ' + CONVERT(VARCHAR(MAX), @NewId) + ' AS TransactionHoldID,
te.ItemLookupCode,
item.Description,
te.ItemID,
SUM(te.Quantity) Quantity,
SUM(te.SalesTax) Tax,
SUM(te.Price * te.Quantity) Value,
SUM(te.Price * te.Quantity) / SUM(te.Quantity) Price,
item.price FullPrice,
--1 AS Taxable,
GETDATE() AS TransactionTime,
''1899-12-30'' AS VoucherExpirationDate
FROM
TransactionEntry te
LEFT JOIN
item ON item.id = te.ItemID
INNER JOIN
item nItem ON nitem.ItemLookupCode = item.itemlookupcode
WHERE
te.TransactionDate >= ''' + CONVERT(VARCHAR, CAST(@TransactionDateFrom AS DATE), 102) +
''' AND te.TransactionDate <= ''' +
CONVERT(VARCHAR, CAST(@TransactionDateTo AS DATE), 102) +
''' AND item.department IN (' + @Department + ')
AND te.storeid = ' + convert(varchar(max), @StoreID)+'
group by
te.StoreID,
te.ItemLookupCode,
item.Description,
te.ItemID,
item.price
'
EXECUTE sp_executesql @HoldEntryQry, @HoldEntryParamDefinition, @NewId, @Department, @Storeid,@TransactionDateFrom, @TransactionDateTo
END
当我执行Print @HoldEntryQry
时,查询如下所示
select
te.StoreID,
15 AS TransactionHoldID,
te.ItemLookupCode,
item.Description,
te.ItemID,
sum(te.Quantity) Quantity,
sum(te.SalesTax) Tax,
sum(te.Price * te.Quantity) Value,
sum(te.Price * te.Quantity)/sum(te.Quantity) Price,
item.price FullPrice,
1 AS Taxable,
Getdate() AS TransactionTime,
'1899-12-30' AS VoucherExpirationDate
from
TransactionEntry te
left join item on item.id = te.ItemID
inner join item nItem on nitem.ItemLookupCode = item.itemlookupcode
where
te.TransactionDate >= '2018.04.16' and te.TransactionDate <='2018.04.30' and item.department in ('Apple','Orange','Dates') and te.storeid = 5555
group by
te.StoreID,
te.ItemLookupCode,
item.Description,
te.ItemID,
item.price
打印的查询返回了我期望的确切结果
答案 0 :(得分:0)
问题可能是+@Department+
。如果+
的任何参数不是字符串,则可能会出现转换错误。
但不要只做cast(@department as varchar(255))
。解决问题的根本原因。您已经了解参数。将它们用于where
子句中的所有常量!这将使您的调试更容易。