2016-03-28 4 views
0

クエリを処理していて、outcomesテーブルから結果をフェッチする関数を作成しました。UDFのテーブル変数を宣言して、テーブル名をパラメータとして入力します。

CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) 
RETURNS TABLE 
AS 
    RETURN 
     SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' 
      + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) 
      + ' ' 
      + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work 
     FROM outcomes 
     WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 

上記のコードの問題は、私が実行時に入力したものパラメータは関係ありません、それはいつものように長い間、私は入力されたパラメータは、データベース内の有効なテーブル名であるように、結果を与えるということです。

私はと入力した場合にのみ、FROM部分にテーブル名を入力するためのパラメータを作成できるかどうかは疑問です。結果が表示されます。

私は、次のコードを使用して、テーブル変数を宣言しようとした:私はUDFにテーブル変数を統合するかどうかはわからないが

declare @ship_outcome table 
( final_work nvarchar(30) 
) 

insert into @ship_outcome (final_work) 
select 
     left(ship, charindex(' ', ship) - 1) + ' ' + 
     replicate('*', charindex(' ', substring(ship, charindex(' ', ship) + 1, len(ship))) + 1 -2) + ' ' + 
     reverse(left(reverse(ship), charindex(' ', reverse(ship)) - 1)) 
from outcomes 
where charindex(' ', substring(ship, charindex(' ', ship) + 1, len(ship))) > 1; 

select * from @ship_outcome 

を。助けてください。

+0

明らかではありません。 '@tbl = outcomes'のときだけ結果を得たいですか? –

+1

'WHERE '節に' AND @tbl =' outcomes''を追加する – Squirrel

+0

この場合、この関数自体を呼び出さないようにします。 –

答えて

1

また、IF文の下に述べたように、マルチステートメントのテーブル値関数で使用して結果を達成することができます -

CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) 
RETURNS @t table 
(final_work nvarchar(30)) 
AS 
begin 
if @tbl = 'outcomes' 
begin 
     Insert into @t 
     SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' 
      + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) 
      + ' ' 
      + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work 
     FROM outcomes 
     WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 
end 
return 
end 

注 - マルチステートメントのテーブル値関数のパフォーマンスが大規模なレコードの恐ろしいです。インラインテーブル値関数のwhere句で@tbl = 'outcomes'を使用してインライン関数を使用することをお勧めします。 -

CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) 
RETURNS TABLE 
AS 
    RETURN 
     SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' 
      + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) 
      + ' ' 
      + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work 
     FROM outcomes 
     WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 and @tbl = 'outcomes' 
+0

ソリューションに感謝します。 'WHERE'ステートメントに条件を追加することについて言及したように、' AND @tbl = 'outcomes''を追加するだけでそれを行いますか? – malamoji

+0

インラインテーブル値関数のwhere節に@tbl = 'outcomes'という条件を追加しました。私の更新された回答を参照してください – sam

+0

更新のおかげでこんにちは。私が気づいたもう一つのことは、 'begin'の後に' insert'文が必要だと思います。 – malamoji

関連する問題