无法将VARCHAR转换为INT

时间:2019-11-20 11:18:07

标签: sql sql-server

我在sql中写了变量

这是代码

 DECLARE @rowNumber INT
SET @rowNumber = 'SELECT CAST((-1) * ROW_NUMBER() over (ORDER BY (t.Id)) AS INT)
FROM [dbo].[AbpTenants] as t
ORDER BY t.Id'
EXEC (@rowNumber)

但是当我尝试运行它时,出现了此错误。

  

S0001] [245]从[dbo]转换varchar值'SELECT CAST((-1)* ROW_NUMBER()over(ORDER BY(t.Id))AS INT)时,转换失败。[AbpTenants]为t将t.Id'排序为int数据类型。

问题出在哪里,如何将其转换为int?

2 个答案:

答案 0 :(得分:1)

您的查询由于多种原因而没有意义:

  • 您正在为字符串设置整数参数。
  • 您正在为查询结果设置一个值,这很可能会返回多行。
  • 您正在转换将int返回给int的函数的结果。
  • 您要创建一个负数并将其称为“行号”。行号通常不是负数。

我怀疑您要计算,而不是子查询。如果要计算表中的行数,请使用:

DECLARE @rowNumber INT;

SELECT @rowNumber = COUNT(*)
FROM [dbo].[AbpTenants] t;

这与您的逻辑并不完全相同,但确实有道理。

答案 1 :(得分:0)

您可以使用负数进行乘法:

DECLARE @rowNumber INT

SET @rowNumber = COUNT(*) * -1
FROM [dbo].[AbpTenants] t;

SELECT @rowNumber 

编辑::如果想要所有行的行号,则需要表变量。

您有一个定标器变量@rowNumber,它将仅包含单个值,而不包含多个值。

DECLARE @rownumber TABLE (id INT, rowNumbers INT)

INSERT INTO @rownumber (id, rowNumbers)
    SELECT t.id, ROW_NUMBER() OVER (ORDER BY t.id)
    FROM [dbo].[AbpTenants] t;

SELECT *
FROM @rownumber;