1

私はテーブル、2つの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

私はあなたにも質問をするためのものと確信していますか...? –

+1

テーブルbのabcのカラムタイプは何ですか? –

+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(選択トップ1値からdbo.Split(x.abc、 '_') )f WHERE x.abc LIKE f.value 「APPLY」付近の構文が正しくありません。 '。'の近くの構文が正しくありません。 – user1178514

+0

@ user1178514 - 私は1つの ')'が欠けています。答えは修正されました。 –

+0

ありがとう。それは今では動作します。私はSQL Server 2000上にいるので、CROSS APPLYは機能しません...私はappraentlyあなたが提案した別の方法を使用しました。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

dbo.Split( 'xxx_xx'、 '_')からselect *を呼び出すことはできますが、 – user1178514

関連する問題