2016-11-24 8 views
2

私はまだSQLを学んでおり、どのようにcross applyクエリの関数に行の値を渡すことができますか?SQL Server:提供された行の値に基づいて各行の関数を実行

:...開始日と終了日、および週間隔で分割した日付を返します

例を - 私は2つの引数を取る関数を持っている、これは

SELECT 
    [Project], [emp_id], 
    [Allocation_start], [Allocation_end] 
FROM 
    First_table 

私の最初のテーブルであると仮定すると

select * from [udf_GetIntervals]('2017-01-01','2017-01-30') 

データ:

dt_start dt_end 
---------------------- 
2016-12-26 2017-01-01 
2017-01-02 2017-01-08 
2017-01-09 2017-01-15 
2017-01-16 2017-01-22 
2017-01-23 2017-01-29 
2017-01-30 2017-02-05 

私は、上記の関数を7月1日から12月30日までの日付で実行し、それを仮想テーブルに格納し、そのテーブルでクロス適用を使用しました。

作品
select * 
from [First_table] 
cross apply 
    (select * from #temp) b 

が、それは常に最初のテーブルから1つのプロジェクトのレコードごとに、すべての週を返しfirst_tables開始日と終了日とは独立して動作します。

私はfirst_tablesのstart_dateとend_dateの値を使って、どうやってこれを行うことができるのだろうと思っていたので、十字適用は行の開始/終了日に含まれるweek_intervalsのレコードのみを返します。

私はこの問題について何かヒントをいただきたいと思います。あなたはAPPLYを使用することができます

+0

「First_table」には何が含まれていますか? – Viki888

+0

最初の表のデータと最終結果の例を説明してください。 –

+1

まず、よく考え抜かれた詳細な質問を書いてください。 SQLを習得している場合、いくつかのアドバイスを受けてください。プログラミングのようなものではなく、すべての機能を記述して関数を呼び出します。あなたは 'セットベースの'解決策を実行することについて考えるべきです。この場合は、すべての可能な値を持つカレンダー表を作成して結合することを意味します。関数を使用すると、100行、1000行、10,000行で正常に動作しますが、最終的に行数が増えると、パフォーマンスが床から落ちてしまい、急いで何かを書き直さなくなります。 –

答えて

3

行方向アクションを実行しません。 CROSS APPLYは、INNER JOINと同様に動作しますが、OUTER APPLYは、LEFT JOINとかなり似ています。

テーブル値関数はテーブルを返します。エイリアスを指定して、この結果セットを列リストに含める必要があります。

SELECT [Project] 
     ,[emp_id] 
     ,[Allocation_start] 
     ,[Allocation_end] 
     ,WeekDates.* 
From First_table 
CROSS APPLY dbo.[udf_GetIntervals]([Allocation_start],[Allocation_end]) AS WeekDates 
+0

ありがとうございました:) –

3
select * 
from First_table cross apply [udf_GetIntervals]([Allocation_start],[Allocation_end])