1

У меня есть пользовательская функция, которая возвращает таблицу она принимает два VARCHARS, она разделяет VARCHAR на основе разделителейИспользования переменного с функцией - SQL

SELECT VALUE FROM dbo.Split('xxx','_') --- working 

select abc from abcd a,cde b where a.abc like (SELECT VALUE FROM dbo.Split(b.abc,'_'))-- not working 


select abc from abcd a,cde b where a.abc like (SELECT VALUE FROM dbo.Split('xx','_'))-- working 

select abc from abcd a,cde b where a.abc like (SELECT b.abc)-- working 

Как получить не работает дело работать.

Ошибка я получаю Неправильный синтаксис рядом с..

+1

Я уверен, что вы имели в виду, чтобы задать вопрос, а ...? –

+1

Каков тип столбца abc из таблицы b? –

+0

@MikaelEriksson он хочет знать, почему этот случай не работает, проверьте комментарии. –

ответ

2

Использование CROSS APPLY позволяет использовать переменную в качестве параметра функции.

SELECT abc 
FROM abcd a 
     , cde b 
     CROSS APPLY (select VALUE from dbo.Split(b.abc, '_')) f 
WHERE a.abc LIKE f.Value 

или

SELECT * 
FROM abcd a 
     , cde b   
     CROSS APPLY dbo.Split(b.abc, '_') f 
WHERE a.abc LIKE f.Value 

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

тестовый скрипт

CREATE FUNCTION dbo.Split(@a VARCHAR(4), @b VARCHAR(4)) 
RETURNS TABLE 
AS RETURN 
(
    SELECT Value = 'Test' 
) 
GO 

;WITH abcd (abc) AS (
    SELECT 'Test' 
) 
, cde (abc) AS (
    SELECT 'Test' 
) 
SELECT * 
FROM abcd a 
     , cde b   
     CROSS APPLY (SELECT Value FROM dbo.Split(b.abc, '_')) f 
WHERE a.abc LIKE f.Value 
+0

SELECT * FROM tablesxx c, tableyyy y CROSS APPLY (SELECT TOP 1 VALUE FROM dbo.Split (x.abc, '_')) f WHERE x.abc LIKE f.value Неправильный синтаксис около 'APPLY'. Неверный синтаксис около '.'. – user1178514

+0

@ user1178514 - Я пропустил один ')'. Ответ был исправлен. –

+0

Спасибо большое. Теперь это работает. CROSS APPLY не работает, потому что я на SQL SERVER 2000 ... поэтому я использовал другой метод, который, по вашему мнению, вы http://stackoverflow.com/questions/4644740/cross-apply-does-not-work -with-sql-server-2000 – user1178514

0

вы пробовали:

select abc 
from abcd a, cde b 
where a.abc like dbo.Split(b.abc,'_') 
+0

Поскольку функция возвращает таблицу, когда я вызываю ее так, она выдает неверную ошибку имени объекта. – user1178514

+0

хотя вызов select * из dbo.Split ('xxx_xx', '_') работает – user1178514