【发布时间】:2018-05-17 13:46:32
【问题描述】:
我正在尝试在存储过程中执行sp_executesql。当我执行存储过程时,它会抛出以下错误
消息 8114,第 16 级,状态 5,第 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
打印的查询返回了我期望的确切结果
【问题讨论】:
-
对于初学者,您应该始终指定 varchar 的比例。 sqlblog.org/2009/10/09/… 您还应该使用符合 ANSI 标准的 YYYYMMDD 日期格式。在某些情况下,这些时期会导致问题。
-
但是对我来说最大的问题是你为什么在这里使用动态sql?从您发布的内容来看,这只是一层不需要的复杂性。
-
@SeanLange 你在说
voucherExpirationDate。请留下那个。并感谢您的关注 -
这只是一个看起来像日期的字符串。我在看你的 where 子句。
-
@SeanLange 我真的需要。我的情况完全不同。数据库名称不会一直相同
标签: sql sql-server stored-procedures sp-executesql