stellus Ответов: 2

Переменная имени столбца без динамического запроса


Hi All,

Below query is not returning any row but DB has the value. Can anyone help on this without using dynamic query
DECLARE @Search1 NVARCHAR(200)                                  
 DECLARE @Search2 NVARCHAR(200)
 SET @Search1 = '1673437'
 SET @Search2 = 'SSN'
 SELECT TOP 10 ID, FirstName, LastName, Age FROM Persons WHERE  @Search2 = @Search1



with regards,

stellus.


Что я уже пробовал:

Column name variable without dynamic query 

Santosh kumar Pithani

В вашем фильтре запросов(где 1=2) условие не выполняется, поэтому он возвращает только заголовки.

Dave Kreskowiak

Вы не можете сделать это без динамически построенного запроса. Ну, вы могли бы, но, как заметил Ричард, код действительно уродлив и не делает ничего проще.

2 Ответов

Рейтинг:
0

Richard Deeming

Именно для этого и предназначены динамические запросы.

DECLARE @Search1 NVARCHAR(200);
DECLARE @Search2 NVARCHAR(200);

SET @Search1 = '1673437';
SET @Search2 = 'SSN';


-- Never trust user input!
DECLARE @SearchColumn sysname;

SELECT 
    @SearchColumn = QUOTENAME(name)
FROM
    sys.columns
WHERE
    name = @Search2
And
    object_id = OBJECT_ID(N'Persons')
;

DECLARE @command nvarchar(max);
SET @command = N'SELECT TOP 10 ID, FirstName, LastName, Age FROM Persons WHERE ' + @SearchColumn + N' = @Search1';
EXEC sp_executesql @command, N'@Search1 nvarchar(200)', @Search1 = @Search1;

sp_executesql (Transact-SQL) | Microsoft Docs[^]

Если по какой-то странной причине вы не можете или не хотите использовать динамический запрос, то ваш единственный вариант-это отдельная проверка для каждого возможного столбца:
SELECT TOP 10 
    ID, 
    FirstName, 
    LastName, 
    Age 
FROM 
    Persons 
WHERE 
    (@Search2 = N'SSN' And SSN = @Search1)
Or 
    (@Search2 = N'FirstName' And FirstName = @Search1)
Or 
    ...


Рейтинг:
0

Santosh kumar Pithani

SELECT TOP 10 ID, FirstName, LastName, Age,@Search1  AS Col1,@Search2 AS Col2
 FROM Persons
   WHERE  @Search1 = @Search1 And @Search2 = @Search2  


stellus

привет Сантош,
спасибо за ответ,
я хочу позвонить @search1 непосредственно в where condition,
подобный этому,
Выберите топ-10 ID, имя, фамилию, возраст из числа лиц, где @Search2 = @Search1
возможно ли это?

Santosh kumar Pithani

это возможно, но @Search2,@Search1 оба значения должны быть одинаковыми.

Dave Kreskowiak

Неправильно, неправильно, неправильно. Ваш запрос, если он вообще будет работать, вернет только все строки в таблице, а не отфильтрованные вообще.

Santosh kumar Pithani

Мой запрос корректен в соответствии с OP "WHERE @Search2 = @Search1" это условие работает как true или false ,оно возвращает все строки, если это true(1=1), иначе false(1=3)нулевые строки.Я не знаю, почему он опубликовал такой вопрос без динамического запроса:)

Dave Kreskowiak

Это не то, что вы вкладываете в свое "решение":
Где @Search1 = @Search1 и @Search2 = @Search2

Santosh kumar Pithani

Я четко упомянул: "это возможно, но @Search2,@Search1 оба значения должны быть одинаковыми".это решение дается потому, что ОП ищет истинное условие.

Dave Kreskowiak

Вы где клаузула ничем не отличается от

    WHERE 1 = 1 AND 2 = 2

Так что продолжайте и попробуйте рассказать мне, как это решает проблему написания запроса, который отфильтровывает строки, когда предложение WHERE всегда истинно для всех строк.

Santosh kumar Pithani

Я знаю, что с помощью динамической фильтрации запросов можно использовать две разные переменные, но OP явно "ниже запроса не возвращает ни одной строки, но DB имеет значение. Может ли кто-нибудь помочь в этом без использования динамического запроса"

Dave Kreskowiak

Да, и ваш "ответ" не отвечает на вопрос и на то, что должен делать запрос ОП. Вы возвращаете все строки, несмотря ни на что. С таким же успехом вы можете даже не иметь пункта WHERE в своем "решении".