Рейтинг:
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 в своем "решении".