Sql server t-sql存储过程将字段名作为参数传递
存储过程可以从表1中选择Value1…,但我想动态更改列名。。。和Value1、Value2一样,我希望将@Field作为参数传递 我做错了什么,伙计们?提前谢谢 表1: 栏目: 位置-nvarchar50 值1-小数点18,2 值2-小数点18,2 代码:Sql server t-sql存储过程将字段名作为参数传递,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,存储过程可以从表1中选择Value1…,但我想动态更改列名。。。和Value1、Value2一样,我希望将@Field作为参数传递 我做错了什么,伙计们?提前谢谢 表1: 栏目: 位置-nvarchar50 值1-小数点18,2 值2-小数点18,2 代码: 我正在从对象资源管理器执行,在鼠标左键单击“执行存储过程”您需要使用动态SQL来执行此操作。例如: DECLARE @Query AS VARCHAR(MAX) SET @Query = 'SELECT [' + @Field + '] f
我正在从对象资源管理器执行,在鼠标左键单击“执行存储过程”您需要使用动态SQL来执行此操作。例如:
DECLARE @Query AS VARCHAR(MAX)
SET @Query = 'SELECT [' + @Field + '] from Table1 WHERE Location= ''' + @Loc + ''''
EXECUTE(@Query)
将发送另一个参数@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提供的解决方案也是可行的,但要比较:
1/如果您的查询变得更大,使用更多参数=>将很难管理它。
2/任何语法错误都将在设计时(即EXEC运行时)发现。
3/I将动态避免SQLs,即EXEC,因为查询计划的缓存方式不同。想象一下,服务器无法预先猜到字符串后面的内容。使用sp_executesql会更好,但在这种情况下不能使用。如果有人能在这里给出更多的解释,这将有所帮助。
这可能导致SQL注入。小心
(SELECT CONVERT(decimal(18,2),@Field) from ...
(SELECT ' + @Field +' from ...
DECLARE @Query AS VARCHAR(MAX)
SET @Query = 'SELECT [' + @Field + '] from Table1 WHERE Location= ''' + @Loc + ''''
EXECUTE(@Query)
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