Параметр не работает для varchar

Приведенный ниже код 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 с помощью переменной?

@gsa sqlserver причины

hotfix 03.08.2018 14:06

Я хочу, чтобы выбранный столбец определялся содержимым переменной. [Price_per_KG_AES001] - имя столбца. Однако это может измениться, поэтому необходимо передать переменную @Customer.

Andy 03.08.2018 14:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен динамический 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);

Это не решило проблему. Извините, если мой исходный пост был непонятен.

Andy 03.08.2018 14:10

Price_per_KG_AES001 - имя столбца.

Andy 03.08.2018 14:10

OP хочет, чтобы выбранный столбец определялся содержимым переменной. Итак, вы правы, требуется динамический SQL, но то, что вы написали, не является динамическим SQL.

MatBailie 03.08.2018 14:12

Вы правы, MatBailie, это то, что мне нужно. Как мне выполнить динамический SQL, чтобы столбец, выбранный для определения содержимого переменной?

Andy 03.08.2018 14:14

Что вам нужно сделать, так это заменить содержимое вашей переменной в свой запрос, а затем выполнить его.

Что-то вроде этого...

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

Другие вопросы по теме