我在SPROC之下,其中我传递列名(值)以及其他参数(Place,Scenario)。
ALTER PROCEDURE [dbo].[up_GetValue]
@Value varchar(20), @Place varchar(10),@Scenario varchar(20), @Number varchar(10)
AS BEGIN
SET NOCOUNT ON;
DECLARE @SQLquery AS NVARCHAR(MAX)
set @SQLquery = 'SELECT ' + @Value + ' from PDetail where Place = ' + @Place + ' and Scenario = ' + @Scenario + ' and Number = ' + @Number
exec sp_executesql @SQLquery
END
GO
执行时:exec [dbo]。[up_GetValue]'服务','首页','代理','123697'
我收到以下错误信息
无效的列名称'HOME'。 列名称“代理”无效。
我是否需要在sproc中添加任何东西?
答案 0 :(得分:1)
首先:您将问题标记为mysql,但我认为您的代码是MSSQL。
无论如何,你的问题是你需要在每个字符串值参数周围添加引号。
像这样:
alter PROCEDURE [dbo].[up_GetValue]
@Value varchar(20), @Place varchar(10),@Scenario varchar(20), @Number varchar(10)
AS BEGIN
SET NOCOUNT ON;
DECLARE @SQLquery AS NVARCHAR(MAX)
set @SQLquery = 'SELECT ' + QUOTENAME(@Value) + ' from PDetail where Place = ''' + @Place + ''' and Scenario = ''' + @Scenario + ''' and Number = ''' + @Number +''''
print @SQLquery
exec sp_executesql @SQLquery
END
GO
更新
使用QUOTENAME
确保其有效。
QUOTENAME:
返回一个Unicode字符串,其中添加了分隔符,以使输入字符串成为有效的SQL Server分隔标识符。
答案 1 :(得分:0)
您需要使用"。
引用带有`(反引号)和字符串值的列名set @SQLquery = 'SELECT `' + @Value + '` from PDetail where Place = "' + @Place + '" and Scenario = "' + @Scenario + '" and Number = ' + @Number
答案 2 :(得分:0)
尝试使用预准备语句而不是连接字符串。
示例:
PREPARE stmt1 FROM 'SELECT ? from PDetail where Place = ? and Scenario = ? and Number = ?;
EXECUTE stmt1 USING @Value, @Place, @Scenario, @Number;