2011-05-02 4 views
12

두 테이블이 있습니다.MS SQL Server에서 각각에 대해?

EmployeePayroll (PayrollID, EmployeeID, VoucherNo, BasicSalary, SalaryMonth)EmployeePayroll (PayrollID, EmployeeID, VoucherNo, BasicSalary, SalaryMonth)

두 번째 테이블에 (0, EmployeeID,0 ,0 ,0) 같은 더미 데이터를 삽입 할 수 있도록 모든 테이블에 모든 직원에 대해 for each 루프를 만들려고합니다.

for 루프로 만들려고했지만 MS SQL Server에 for each 루프가 있습니까?

+6

SQL은 집합 기반 언어입니다 알 수 있습니다. for-loops와 같은 절차 코드를 사용하지 않으려합니다. – jeroenh

+0

SQL 테이블에 더미 데이터 삽입 ?? 뭔가 더러운 냄새가 여기에 ... SQL은 MS Excel이 아닙니다 :-) – TMS

답변

22

사용하여 다음 문 :

INSERT INTO EmployeePayroll 
SELECT 
    0,EmployeeID ,0,0,0 
FROM 
    Employees 

당신은 추가로 삽입하기 전에 레코드의 실존을 확인할 수 있습니다 : 당신이 정말 루프 필요한 경우

WHERE 
    ID NOT IN 
    (
    SELECT 
     EmployeeID 
    FROM 
     EmployeePayroll 
) 
+0

이 코드는 현재 문제를 확실하게 해결할 것입니다. 알라에게 시리아를 저장해달라고 부탁합니다.하지만 작은 예제 만 작성했기 때문에 각각 사용할 수 있습니다. 쉽게 만들 수 있지만 실제 코드는 매우 길며 코드 내에 3 가지 이상의 함수가 사용됩니다. SQL 서버의 각 루프마다 또는 루프 만 사용해야합니까? – HAJJAJ

+0

@HAJJAJ : 알라 신의 예멘도 내 친구. [커서] (http://msdn.microsoft.com/en-us/library/ms180169.aspx)를 사용하여 행을 반복하는 것이 좋습니다. –

25

, 당신은 사용할 수 있습니다 커서.

DECLARE c CURSOR READ_ONLY FAST_FORWARD FOR 
    SELECT EmployeeID 
    FROM Employees 

DECLARE @id Int 

-- Open the cursor 
OPEN c 

FETCH NEXT FROM c INTO @id 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    INSERT INTO EmployeePayroll 
    SELECT 0, @id, 0, 0, 0 

    -- do other stuff 

    FETCH NEXT FROM c INTO @id 
END 

-- Close and deallocate the cursor 
CLOSE c 
DEALLOCATE c 
+8

+1 성능 경고 : "매우 효율적이지는 않습니다"는 삼가면서 말하는 것입니다. 서버를 무릎 꿇게하려면 커서를 사용하십시오. –

+4

맞습니다. 내 중대한 실수를 "몹시 비효율적"으로 수정했습니다.) –

+0

@DavidDuffett - 언제 비효율적이게됩니까? 이 쿼리에서 오는 10-100 개의 행만 있습니다. - EXEC xp_dirtree 'C : \ Files', 10, 1 ' – Steam

0

HI 제로

payrollID 할 필요가 열의

사용 기본 제약 : 당신이 절대적으로 필요하지 않는 한 피해야한다, 그래서 그들은끔찍하게 비효율적 바우처 번호, BasicSalary, 급여 - 월

같은 에 대한 직원 ID 및 루프 & 임시 테이블 변수가

이 샘플 쿼리는 다음과 같다 동안이 사용하여 요구 사항을 달성하기위한 하나의 방법입니다 위에서 언급 한 개념

5

를 사용

--: Get the Employees table data & insert this to temp table variable 
Declare @TempEmpTbl Table (RowId int identity, EmployeeID int, EmployeeName nvarchar(100), EmployeeStatus int, BasicSalary int); 
Insert into @TempEmpTbl Select * from Employees; 

--: temp variables 
Declare @TempEmpCount Int = (Select Count(RowId) From @TempEmpTbl); 
Declare @MinCount Int = 1; 
Declare @GetEmpId int; 

--: while loop for EmployeePayroll tbl insertion based on Employees data 
While(@TempEmpCount >= @MinCount) 
Begin 
    Set @GetEmpId = (Select EmployeeID From @TempEmpTbl Where RowId = @MinCount); 
    Insert into EmployeePayroll values (0, @GetEmpId,0 ,0 ,0) 
    Set @MinCount = @MinCount + 1; 
End 

참고 : 직원 기록이 이미 있다고 가정하면이 while 루프 내에서 EmployeePayroll 레코드를 업데이트 할 수 있습니다.

2
INSERT INTO EmployeePayroll 
SELECT 
0,E.EmployeeID ,0,0,0 
FROM 
Employees E 
WHERE 
NOT EXISTS 
(
    SELECT 
     1 
    FROM 
     EmployeePayroll WHERE EmployeeID = E.Id 
) 

희망이이 대부분 내가 SQL에서 foreach 루프에 대한 괜찮은 방법을 찾고 있었다이

0

을 달성하는 방법을 최적화이 쉬운 코드

SELECT RowNum = ROW_NUMBER() OVER(ORDER BY Id),* 
INTO #Locations 
FROM [dbo].[Location] 

DECLARE @MaxRownum INT 
SET @MaxRownum = (SELECT MAX(RowNum) FROM #Locations) 

DECLARE @Iter INT 
SET @Iter = (SELECT MIN(RowNum) FROM #Locations) 



WHILE @Iter <= @MaxRownum 
BEGIN 
DECLARE @currentCountry varchar(250) 
DECLARE @locId int 
SET @currentCountry = (SELECT Country 
         FROM #Locations 
         WHERE RowNum = @Iter) 

SET @LocId = ( SELECT Id 
       FROM #Locations 
       WHERE RowNum = @Iter) 



    -- run your operation here 
Update [dbo].[Location] 
SET CountryId = (SELECT (Id) FROM [dbo].[Site] WHERE [dbo].[Site].Name = @currentCountry) 
WHERE [dbo].[Location].Id = @locId 


    SET @Iter = @Iter + 1 
END 

DROP TABLE #Locations 
해낸있다

하는 데 도움이

+0

http://sqlserverplanet.com/tsql/sql-server-for-each-row-next –

관련 문제