【问题标题】:Error converting data type varchar to int dynamic SQL select statement将数据类型 varchar 转换为 int 动态 SQL 选择语句时出错
【发布时间】: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


【解决方案1】:

问题可能是+@Department+。如果 +any 参数不是字符串,您可能会遇到转换错误。

但不要只做cast(@department as varchar(255))。修复问题的根本原因。你已经知道参数了。将它们用于where 子句中的所有常量!这将使您的调试更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多