1

我有自定义函数返回一个表 它接受两个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 

如何让没有工作的情况下工作的VARCHAR。

的错误,我得到它 附近有语法错误。“。

+1

我敢肯定,你的意思是问一个问题,以及...? – 2012-02-07 11:19:17

+1

什么是从B表ABC的列类型? – 2012-02-07 11:20:31

+0

@MikaelEriksson他想知道为什么这种情况下不工作,检查的意见。 – 2012-02-07 11:20:49

回答

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 

APPLY运算符允许你调用一个表值函数为 由查询的外部表表达式返回的每一行。

测试脚本

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 2012-02-07 11:45:18

+0

@ user1178514 - 我已经错过了一个')'。答案已被纠正。 – 2012-02-07 12:26:19

+0

非常感谢。它适用于现在..CROSS应用程序不工作,因为我在SQL SERVER 2000 ...所以我用另一种方法,你appraently你建议http://stackoverflow.com/questions/4644740/cross-apply-does-not-work -with-sql-server-2000 – user1178514 2012-02-07 13:33:19

0

你尝试过:

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

当我像这样调用它时,函数返回一个表,它会抛出无效的对象名称错误。 – user1178514 2012-02-07 11:24:04

+0

虽然调用select * from dbo.Split('xxx_xx','_')works – user1178514 2012-02-07 11:24:56