存储过程适用于SELECT Value1 from Table1...
,但我想动态更改列名...就像Value1 , Value2
所以我想传递(@Field
)作为参数。< / p>
我做错了什么?提前谢谢。
Table1
:
ID | Location | Value1 | Value2
---------------------------------------
1 L01 123.00 234.00
2 L02 234.00 456.00
3 L03 456.00 234.00
列:
Location - nvarchar(50)
Value1 - decimal(18, 2)
Value2 - decimal(18,2)
代码:
ALTER PROCEDURE [dbo].[sp_GetFieldValue]
@Loc nvarchar(50),
@Field nvarchar(50), <--------- Error converting data type nvarchar to numeric.
@Field_Out decimal(18,2) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET @Field_Out = (SELECT @Field from Table1 WHERE Location=@Loc)
END
我尝试过没有结果:
(SELECT CONVERT(decimal(18,2),@Field) from ...
(SELECT ' + @Field +' from ...
我正在从对象资源管理器执行,在鼠标右键单击“执行存储过程”
答案 0 :(得分:0)
您需要使用动态SQL来执行此操作。例如:
DECLARE @Query AS VARCHAR(MAX)
SET @Query = 'SELECT [' + @Field + '] from Table1 WHERE Location= ''' + @Loc + ''''
EXECUTE(@Query)
答案 1 :(得分:0)
一个想法会被发送另一个参数@Field_No,表示要返回的字段。
ALTER PROCEDURE [dbo].[sp_GetFieldValue]
@Loc nvarchar(50),
@Field_No TINYINT,
@Field_Out decimal(18,2) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @Field_Out = CASE Field_No
WHEN 1 THEN Value1
WHEN 2 THEN Value2
END
FROM Table1
WHERE Location=@Loc
END
稍后编辑1:
@roryap提供的解决方案也是可行的,但要进行比较:
EXEC
的运行时间)。 sp_executesql
本来会更好,但在这种情况下您无法使用。如果有人能在这里给出更多解释,这将有所帮助。