我有两个存储过程,非常相似,但是它们返回不同的结果!
我需要的是一个存储过程,该过程返回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。
答案 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