0

私はテーブルを持っています

WS_ID WS_WEBPAGE_ID WS_SPONSORS_ID WS_STATUS WS_CREATEDTS
2 3 2 N 2012-06-07 15:32:00
3 3 3 N 2012-06-07 15:37:00
4 3 4 年 2012-06-07 15:41:00
5 1 1 年 2012-06-07 16:05:00
6 2 1 年 2012-06-07 16:05:00
7 2 4 年 2012-06-07 16:05:00
8 4 1 年 2012-06-07 16:05:00
9 1 3 年 2012-06-07 16:05:00
10 1 2 年 2012-06-07 16:05:00
11 1 4 年 2012-06-07 16:05:00
12 2 3 年 2012-06-07 16:05:00
13 2 3 2012-06-07 16:05:00
14 2 1 年 2012-06-07 16:05:00
24706 3 8,7,9,5,5 NULL NULL

カーソルを作成し、そのカーソルに分割関数を呼び出して最後のレコードを分割しました

Declare @splitc varchar(250)
Declare splitcursor cursor for
select ws_sponsors_id from dbo.TBL_WD_SPONSORS 
open splitcursor
fetch next from splitcursor into @splitc
while(@@FETCH_STATUS = 0)
begin
  print '@splitcursor'

--select * from dbo.Comma_Split(@ws_sponsors_id,',')
select dbo.Comma_Split(ws_sponsors_id,',') from dbo.TBL_WD_SPONSORS where ws_id = 24706

--select * from dbo.TBL_WD_SPONSORS where WS_SPONSORS_ID in(select * from dbo.Comma_Split(ws_sponsors_id,','))

    fetch next from splitcursor into @splitc
  end
  close splitcursor
  deallocate splitcursor

そして、私はエラーが発生しています

列 "dbo" またはユーザー定義関数または集計 "dbo.Comma_Split" が見つからないか、名前があいまいです。

WS_ID WS_WEBPAGE_ID WS_SPONSORS_ID WS_STATUS WS_CREATEDTS


 24706 3 8,7,9,5,5 NULL NULL

しかし、私は出力が必要です

WS_ID WS_WEBPAGE_ID WS_SPONSORS_ID WS_STATUS WS_CREATEDTS
24706 3 8 NULL NULL
24707 3 7 NULL NULL
24708 3 9 NULL NULL
24709 3 5 NULL NULL
24710 3 5 NULL NULL

出力を取得する方法

手伝ってください。

4

2 に答える 2

0

使用しようとしている関数は、実行しているデータベースに存在しないようです。たとえば、これを試してみると、同じエラーが発生します。

SELECT dbo.This_Function_Most_Certainly_Doesnt_Exist('Unless you''re trying to break my example.') 

これは、それがそこにあるかどうかを証明するので、私の言葉を鵜呑みにする必要はありません。カーソルベースのクエリを実行しているデータベースでこれを実行します。

SELECT * FROM INFORMATION_SCHEMA.ROUTINES R WHERE R.ROUTINE_NAME = 'Comma_Split'

行が返されない場合、それは関数がそこに存在しないためです。データベースが間違っているか、バージョンが間違っているか、その上で CREATE FUNCTION を実行する必要があるか、またはそのようなものです。

編集:ちなみに、実際の問題を解決する方法については、カーソルを使用しないでください。カーソルは、データ結果セットに対する反復の形式として使用されます。カーソルで、単一行の値を選択しています。

select dbo.Comma_Split(ws_sponsors_id,',') from dbo.TBL_WD_SPONSORS where ws_id = 24706

あなたが持っている方法では、その行で、テーブルのすべての行に対して1回、その関数を呼び出します。分割関数の良い例を次に示します: http://praveenbattula.blogspot.com/2010/06/best-split-udf-function-with-delimeter.html

それを使用すると、次のように書くだけです。

SELECT dbo.fnStringSplitter(ws_sponsors_id, ',') FROM dbo.TBL_WT_SPONSORS WHERE ws_id = 24706
于 2012-06-11T18:42:19.937 に答える
0

WS_SPONSORS_ID 列に入力される値が 1 つだけになるようにテーブルを再構築して、外部キー関係になるようにしないでください。この分割関数を実行する必要はありません。

于 2012-06-11T17:44:58.843 に答える