【问题标题】:Converting the nvarchar to int将 nvarchar 转换为 int
【发布时间】:2012-10-18 23:03:03
【问题描述】:

我在网上用谷歌搜索了这个问题,我一生都无法弄清楚为什么这一直抛出错误,感谢任何帮助。

转换 nvarchar 值 'SELECT @orderid 时转换失败 = t.orderid FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY creationdatetime DESC) AS row FROM [intranet].[dbo].handbook_appendix_data WHERE id = ' 到数据类型 int。

DECLARE @sql nvarchar(500)
DECLARE @table varchar(40)
SET @table = 'handbook_section_data';
SET @table = 'handbook_appendix_data';

DECLARE @parentid INT
DECLARE @id INT
DECLARE @published INT
DECLARE @orderid INT
SET @parentid = 2
SET @id = -1
SET @published = 1

SET @sql = N'SELECT @orderid = t.orderid FROM 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY creationdatetime DESC) AS row FROM [intranet].[dbo].'+@table+' WHERE id = '+@id+' AND published = '+@published+') AS t
WHERE t.published = '+@published+' AND t.row = 1';
EXEC SP_EXECUTESQL @sql, N'@orderid INT OUTPUT', @orderid = @orderid OUTPUT --Get the OrderID from ID

PRINT @orderid

【问题讨论】:

    标签: sql-server-2008 stored-procedures


    【解决方案1】:

    您需要将 @id@published 整数转换为 varchar

     convert(varchar(50),@published) 
    

    SET @sql = N'SELECT @orderid = t.orderid FROM 
    (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY creationdatetime DESC) AS row FROM [intranet].[dbo].'+@table+' WHERE id = '+     convert(varchar(50),@id) +' AND published = '+     convert(varchar(50),@published) +') AS t
    WHERE t.published = '+convert(varchar(50), @published) +' AND t.row = 1';
    

    更好的解决方案是避免字符串连接,并使用 sp_executesql 传递 @id@published 参数,就像您对 @orderid 所做的那样,或者完全质疑动态 SQL 的要求?

    【讨论】:

    • 我使用了动态的,所以我可以有多个具有相同结构的表来分离数据,它只是一个内部系统,没什么大不了的。
    【解决方案2】:

    您需要将整数变量转换为字符类型:

     ....
     WHERE id =' + cast(@id as varchar(32)) + ' AND published = ' + cast(@published as varchar(32)) + ') AS t ...
    

    【讨论】:

      【解决方案3】:

      WHERE t.published = '+@published+' AND t.row = 1'

      @published 是一个int。 SQL Server 已决定 + 必须介于两个 ints 之间,并尝试将字符串转换为 int

      要阻止这种情况,请强制 @published 改为字符串 - 然后添加两个字符串(串联):

      WHERE t.published = '+CONVERT(varchar(10),@published)+' AND t.row = 1'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 2012-08-16
        • 2011-01-09
        • 1970-01-01
        相关资源
        最近更新 更多