SQL Server存储过程的麻烦

时间:2019-03-06 17:16:41

标签: sql sql-server stored-procedures

我有两个存储过程,非常相似,但是它们返回不同的结果!

我需要的是一个存储过程,该过程返回Access中记录集的数据。

我拥有的第一个示例是使用一个参数的简单选择,该参数返回我想要的内容,但不允许我指定要返回的列:

EXEC  GetA @ID = '1234';

上面的代码针对的存储过程:

SELECT 
    column1
FROM 
    tbl_A
WHERE 
    ID = @ID

这很好,它从列中返回结果。例如,来自指定单元格的某些文本,其中ID = @ID。

我要工作的第二个查询使用一个case语句选择我需要的列,但是我没有返回像上面的查询那样的“文本”结果,而是收到一条错误消息,指出它无法将varchar转换为int结果。

EXEC  GetA @ID = '1234', @columnName = 'column1';

存储过程:

SELECT 
    CASE
       WHEN @columnName = 'column1' THEN column1
       WHEN @columnName = 'column2' THEN column2
       WHEN @columnName = 'column3' THEN column3
       WHEN @columnName = 'column4' THEN column4
       WHEN @columnName = 'column5' THEN column5
    END
FROM 
    tbl_A
WHERE 
    ID = @ID

有人可以指出我对第二个查询的错吗?它应该返回完全相同的结果,但似乎正在尝试返回INT。查找错误-SQL Server数据库错误:将nvarchar值“结果-文本”转换为数据类型int时,转换失败。

更新:

如果我的语句中只有一个'case',例如...当@columnName ='column1'THEN column1时,这将从我需要​​的单元格中返回文本,但是每当我添加多个case时,它将返回尝试将结果从单元格转换为INT。

3 个答案:

答案 0 :(得分:0)

您的SP返回值被声明为INT,但是您的案例查询似乎不是INT。如果不是INT,则需要对其进行更改。我不确定您数据中的最大列长,因此我更新为50,但是您可能需要对其进行修改

USE [DB];
GO

DECLARE @return_value varchar(50);

EXEC  @return_value = SelectA 
    @ID = '1234',
    @columnName = 'column1';

SELECT @return_value as N'@Return Value';

GO

答案 1 :(得分:0)

一个case表达式返回一个值。此值必须具有类型-只能使用一种类型。

SQL(通常)具有相当特定的规则来确定case表达式的返回类型。当字符串和数字混合在一起时,返回类型为数字。因此,所有值都将转换为数字。如果转换失败,则会出现错误。

换句话说,您不能真正做您想做的事,因为列中的值具有不同的类型。解决方法是,您可以将所有值都转换为字符串。

答案 2 :(得分:0)

找到不适当的非整数数据并将其删除,或尝试以下操作:

SELECT 
CASE
   WHEN @columnName = 'column1' THEN ltrim(rtrim(str(column1)))
   WHEN @columnName = 'column2' THEN ltrim(rtrim(str(column2)))
   WHEN @columnName = 'column3' THEN ltrim(rtrim(str(column3)))
   WHEN @columnName = 'column4' THEN ltrim(rtrim(str(column4)))
   WHEN @columnName = 'column5' THEN ltrim(rtrim(str(column5)))
  END
  FROM  tbl_A WHERE ID = @ID