2015-08-05 5 views
2

Я хотел бы иметь таблицу, в которой я могу хранить XQuery Comparison Expressions, чтобы я мог их оценить в запросе.Выражения сравнения XQuery в столбце SQL

Я делал немного R & D, если это возможно, и я борюсь.

Если я помещаю выражение XQuery в столбец, то, похоже, он по-разному оценивает, если я помещаю выражение XQuery непосредственно в запрос. Например, когда я запускаю ниже запрос:

declare 
    @x xml = '' 

create table #condition 
(
    condition nvarchar(255) 
) 

insert into #condition 
values 
('''1''=''1''') 

select 
    condition, 
    @x.query('sql:column("condition")'), 
    @x.query('''1''=''1''') 
from #condition 

Я бы ожидал, чтобы вернуться:

'1'='1', true, true 

Однако на самом деле возвращает:

'1'='1', '1'='1', true 

Кто-нибудь знает, как я могу оценить выражения сравнения, которые хранятся в столбце?

Возможный план заключается в том, чтобы использовать эту технику для фильтрации строк таблицы на основе существующих условий XQuery. Поэтому, в конечном счете, я хочу, чтобы это можно было сделать в предложении where выражения select.

Я поставил вышеприведенный пример в каталог sql fiddle, который полезен.

Большое спасибо

ответ

1

Короткий ответ: К сожалению, вы не можете.

sql:column("condition") будет оцениваться подходящим типом данных примитива XML на основе типа столбца таблицы. В этом случае значение из столбца condition всегда будет оцениваться как XML string, а не как оператор XQuery, как вы уже выяснили из запуска вашего образца запроса. И я никак не могу понять динамический оператор XQuery, если вы не хотите динамически строить весь запрос и выполнять его позже, возможно, используя sp_executesql.

+1

Привет, чем больше я занимаюсь этим, тем больше я понимаю, почему динамические утверждения XQuery невозможны. Единственный способ, по-моему, вы могли бы искупить его, - это использовать динамический sql, как вы предлагаете, но я бы предпочел не использовать это решение в этом случае. Спасибо, что указал мне в правильном направлении! Вернемся к чертежной доске на этом ... – stormCloud

0

Попробуйте этот запрос:

декларировать @x XML = ''

создать таблицу #condition ( состояние NVARCHAR (255) )

вставки в #condition значения ('' '1' '=' '1' '') выберите состояние, случай, когда COL1 как col2 тогда 'True' еще 'False' END цв, Quer из
( выберите состояние, ParseName (REPLACE (состояние, '=', ''), 2) col1, PARSENAME (REPLACE (условие, '=', '.'), 1) col2, @ x.query ('' '1' '=' '1' '') как quer из #condition ) база

+0

Привет, это будет работать для простого оператора X = Y, однако это не сработает для более сложных операторов xquery (таких как X> Y, (X + Y) stormCloud

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

  • Нет связанных вопросов^_^