2016-11-25 7 views
0

これは私のストアドプロシージャです。基本的にスタッフIDであるINTを入力とみなします。は、ストアドプロシージャにパラメータとしてループを渡します。

CREATE PROCEDURE [dbo].[spMonthlyPayroll] 
@StaffId int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT  StaffId, Name, CNICNumber, Salary, BankAccountNumber,[dbo].[totalWorkingDaysScalar](StaffId, datename(month, GETDATE())) as TotalDaysWorked, [dbo].[totalDaysWorkedScalar](StaffId, datename(month, GETDATE())) as TotalDaysWorked, 
    (CONVERT([date],getdate())) AS PayrollDate, 
    (CONVERT([date],dateadd(month,(-1),dateadd(month,datediff(month,(0),getdate())+(1),(0))))) AS PayrollFrom, 
    (CONVERT([date],dateadd(day,(-1),dateadd(month,datediff(month,(0),getdate())+(1),(0))))) AS PayrollTo, 
    (datename(month,getdate())) + ', ' + (datename(year,getdate())) AS PayrollPeriod, 
    (Salary/[dbo].[totalWorkingDaysScalar](StaffId, datename(month,getdate()))) * [dbo].[totalDaysWorkedScalar](StaffId, datename(month,getdate())) as GrossSalary, 
       .10 as IncomeTaxFactor, 
       ((Salary/[dbo].[totalWorkingDaysScalar](StaffId, datename(month,getdate()))) * [dbo].[totalDaysWorkedScalar](StaffId, datename(month,getdate()))) - ((Salary/[dbo].[totalWorkingDaysScalar](StaffId, datename(month,getdate()))) * [dbo].[totalDaysWorkedScalar](StaffId, datename(month,getdate())) * (.10)) as TotalNetSalary 

FROM   Staff 
where [email protected] 
END 


GO 

入力を手動で入力する必要はありません。私はスタッフテーブルからすべての既存のスタッフIDを取り出すことを、staffIdが依然として唯一のパラメタであることと一緒に、それによって欲しいと思っています。それ、どうやったら出来るの?私はWHILEループを使ってやってみました。しかし、それ

set @StaffId = select Staff.StaffId from Staff 

は助けてくださいselect

に波線を示しています。私はSQL Server 2014を使用しています。

+2

あなたのクエリすでに区切り文字でCOMBINのmultlipleのstaffidの文字列を取得するにはvarchar型の変数にパラメータ@staffIDを変更することができますStaff.StaffIdテーブルを使用するので、テーブル全体をループしたい場合はWHERE条件を削除してください – Mihai

+3

Sprocをテーブル値関数に変換してから、元のCROSS APPLYを行うVIEWを作成してくださいあなたのTVFのテーブル。 – Dai

+0

うん。それはそれを愚かな疑問にする。 – fasih

答えて

2

毎回Staffテーブルのすべてのレコードを返したいときに毎回まったく同じクエリを実行したい場合は、ちょうどビューを作成します。

CREATE VIEW dbo.CurrentMonthPayroll 
AS 
    SELECT StaffId, 
      Name, 
      CNICNumber, 
      Salary, 
      BankAccountNumber, 
      [dbo].[totalWorkingDaysScalar](StaffId, DATENAME(MONTH, GETDATE())) AS TotalWorkingDays, 
      [dbo].[totalDaysWorkedScalar](StaffId, DATENAME(MONTH, GETDATE())) AS TotalDaysWorked, 
      (CONVERT(DATE,GETDATE())) AS PayrollDate, 
      (CONVERT(DATE,DATEADD(MONTH,(-1),DATEADD(MONTH,DATEDIFF(MONTH,(0),GETDATE())+(1),(0))))) AS PayrollFrom, 
      (CONVERT(DATE,DATEADD(DAY,(-1),DATEADD(MONTH,DATEDIFF(MONTH,(0),GETDATE())+(1),(0))))) AS PayrollTo, 
      (DATENAME(MONTH,GETDATE())) + ', ' + (DATENAME(YEAR,GETDATE())) AS PayrollPeriod, 
      (Salary/[dbo].[totalWorkingDaysScalar](StaffId, DATENAME(MONTH,GETDATE()))) * [dbo].[totalDaysWorkedScalar](StaffId, DATENAME(MONTH,GETDATE())) AS GrossSalary, 
      .10 AS IncomeTaxFactor, 
      ((Salary/[dbo].[totalWorkingDaysScalar](StaffId, DATENAME(MONTH,GETDATE()))) * [dbo].[totalDaysWorkedScalar](StaffId, DATENAME(MONTH,GETDATE()))) - ((Salary/[dbo].[totalWorkingDaysScalar](StaffId, DATENAME(MONTH,GETDATE()))) * [dbo].[totalDaysWorkedScalar](StaffId, DATENAME(MONTH,GETDATE())) * (.10)) AS TotalNetSalary 
    FROM Staff 
GO 

あなたはこれらのレコードは、他のいくつかのテーブルにINSERTにしたい場合は、次のことができます。

INSERT INTO PayrollTable 
SELECT StaffId, 
Name, 
CNICNumber, 
Salary, 
BankAccountNumber, 
TotalWorkingDays, 
TotalDaysWorked, 
PayrollDate, 
PayrollFrom, 
PayrollTo, 
PayrollPeriod, 
GrossSalary, 
IncomeTaxFactor, 
TotalNetSalary 
FROM dbo.CurrentMonthPayroll 
0

私はプロセスがループして、各スタッフが良好なパフォーマンスはないと思います。

は、あなたが例えば をプロセスの複数のスタッフをサポートするために、あなたのストアドプロシージャを変更することができ、あなたは

FROM Staff 
where Staff.StaffId=isnull(@StaffIds,Staff.StaffId) --NULL is process all data 
     or case when @StaffIds is null then 1 else 
charindex(','+convert(varchar,Staff.StaffId)+',',','[email protected]+',') end >0 
関連する問題