2015-02-04 5 views
0

Я хочу использовать переменную как имя столбца в моем SQL-запросе.использовать переменную как имя столбца в where where в sql

Проблема:

Я не могу использовать динамический SQL в качестве запроса SQL, что у меня есть, внутри определенной пользователем функции инлайн таблицы.

Так, 1. Невозможно использовать динамический SQL 2. Не удается заменить эту функцию с помощью хранимой процедуры, как это будет называться из определенных пользователем функций только

Каковы другие возможные альтернативы?

Мой код выглядит следующим образом:

create function MatchStringPercent(@parameterFromUser nvarchar(20), @parameterInTable nvarchar(20)) 
RETURNS table As Return 
SELECT Top(1) 
cast(LEN(@parameterInTable) as float)/(Abs(LEN(@parameterFromUser) - LEN(@parameterInTable)) + LEN(@parameterInTable))* 100 As Match 
FROM Demo 
WHERE @parameterInTable = LEFT(@parameterFromUser , LEN(@parameterInTable)) 
ORDER BY LEN(@parameterInTable) DESC 
Go 

Примечание: Это репост. Я задал этот вопрос here и сказал, что это невозможно. Может быть. но просто хотел узнать, есть ли какая-нибудь чертовская альтернатива.

ответ

1

Ваш единственный реальный вариант это гигантский case заявление:

where (case when @parameterInTable = 'col1' then col1 
      when @parameterInTable = 'col2' then col2 
      . . . 
     end) = . . . 

К сожалению, уборщик решение использовать динамический SQL, и вы не можете сделать это из функции.

Я когда-то видел какой-то странный механизм, в котором функция может вызывать xp_cmdshell, а затем использовать cmd_shell для выполнения динамического SQL и затем выполнять работу в командной оболочке. Функции : разрешено выполнять расширенные хранимые процедуры. Я очень сильно препятствую вам идти в этом направлении. Это слишком сложно, он может перестать работать в какой-то момент, и для этого требуется вмешательство с разрешениями, которые могут сделать вашу систему более уязвимой.

EDIT:

Вы, вероятно, хотите немного более сложное выражение (я не понимал параметр был на правой стороне, а также слева):

where ((@parameterInTable = 'col1' and col1 = LEFT(@parameterFromUser , LEN(col1))) or 
     (@parameterInTable = 'col2' and col2 = LEFT(@parameterFromUser , LEN(col2))) or 
     . . . 
    ) 

или с помощью case:

where @parameterFromUser like 
     (case when @parameterInTable = 'col1' then col1 
      when @parameterInTable = 'col2' then col2 
      . . . 
     end) + '%'; 
+0

Он работает с одним утверждением, но дает неправильный синтаксис рядом, перед следующим, когда в каждом утверждении. Какая может быть причина? – Simran

Смежные вопросы