Приведенный ниже код SQL возвращает значение 4,68.
select Top 1 [Price_per_KG_AES001] as [(316) 401 - 600] From [dbo].[tbl_stock_list] where [GRADE] = '316'
Когда я делаю клиента переменной параметра, приведенный ниже SQL возвращает Price_per_KG_AES001.
Declare @TheCustomer varchar(50) = 'Price_per_KG_AES001'
select Top 1 @TheCustomer as [(316) 401 - 600] From [dbo].[tbl_stock_list] where [GRADE] = '316'
Как мне изменить код, чтобы вернуть 4.68 с помощью переменной?
Я хочу, чтобы выбранный столбец определялся содержимым переменной. [Price_per_KG_AES001] - имя столбца. Однако это может измениться, поэтому необходимо передать переменную @Customer.


Вам нужен динамический SQL, текущий синтаксис кажется не работает.
Итак, вам необходимо:
Declare @TheCustomer varchar(50) = 'Price_per_KG_AES001'
declare @sql varchar(500)
set @sql = 'select Top 1 '+ @TheCustomer +' as [(316) 401 - 600]
from [dbo].[tbl_stock_list]
where [GRADE] = ''316'' '
print @sql -- to see how your query looks before execution
exec (@sql);
Это не решило проблему. Извините, если мой исходный пост был непонятен.
Price_per_KG_AES001 - имя столбца.
OP хочет, чтобы выбранный столбец определялся содержимым переменной. Итак, вы правы, требуется динамический SQL, но то, что вы написали, не является динамическим SQL.
Вы правы, MatBailie, это то, что мне нужно. Как мне выполнить динамический SQL, чтобы столбец, выбранный для определения содержимого переменной?
Что вам нужно сделать, так это заменить содержимое вашей переменной в свой запрос, а затем выполнить его.
Что-то вроде этого...
DECLARE
@TheCustomer VARCHAR(50) = 'Price_per_KG_AES001',
@sql_statement VARCHAR(MAX)
SET @sql_statement = 'select Top 1 ' + @TheCustomer + ' as [(316) 401 - 600] From [dbo].[tbl_stock_list] where [GRADE] = ''316'''
EXEC @sql_statement
(Также изучите параметризованные запросы с sp_executesql: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017.)
Но если кому-нибудь удастся «взломать» содержимое этой переменной и поместить в нее некоторый SQL, вы выполните его SQL. См. Атака с использованием SQL-инъекции.
БЕЗОПАСНЫЙ способ защитить себя - это создать белый список допустимых значений. Только если содержимое переменной находится в списке, вы продолжаете.
Или просто используйте инструкцию CASE.
SELECT
TOP(1)
CASE WHEN @var = 'x' THEN table.x
WHEN @var = 'y' THEN table.y
WHEN @var = 'z' THEN table.z END AS column_alias
FROM
table
@gsa sqlserver причины