2013-07-27 2 views
6

T-SQL을 사용하여 테이블에 저장된 SQL 문을 실행할 수 있습니까? 테이블에 저장됩니다T-SQL을 사용하여 테이블에 저장된 SQL 문을 실행하는 방법

DECLARE @Query text 
SET @Query = (Select Query FROM SCM.dbo.CustomQuery) 

명령문은 SELECT의 TOP 100 * ATABLE FROM 더 복잡한 문장이 될 수 임시 문이다 : 나는 을 실행하려는

Select 
J.JobName As Job, 
JD.JobDetailJobStart AS StartDate, 
JD.JobDetailJobEnd AS EndDate, 
(
    SELECT (DATEDIFF(dd, JD.JobDetailJobStart, JD.JobDetailJobEnd) + 1) -(DATEDIFF(wk, JD.JobDetailJobStart, JD.JobDetailJobEnd) * 2) -(CASE WHEN DATENAME(dw, JD.JobDetailJobStart) = 'Sunday' THEN -1 ELSE 0 END) -(CASE WHEN DATENAME(dw, JD.JobDetailJobEnd) = 'Saturday' THEN -1 ELSE 0 END) 
) AS NumberOfWorkingDays, 
JD.JobDetailDailyTarget AS DailyTarget, 
JD.JobDetailWeeklyTarget AS WeeklyTarget, 
JD.JobDetailRequiredQTY AS RequiredQuantity, 
(
    Select SUM(sJL.JobLabourQuantityEmployees) From JobLabour sJL 
) AS NumberOfEmployees, 
(
    Select 
     SUM((sEM.EmployeeDesignationDefaultRate * sJL.JobLabourQuantityEmployees)*8)*(SELECT (DATEDIFF(dd, JD.JobDetailJobStart, JD.JobDetailJobEnd) + 1) -(DATEDIFF(wk, JD.JobDetailJobStart, JD.JobDetailJobEnd) * 2) -(CASE WHEN DATENAME(dw, JD.JobDetailJobStart) = 'Sunday' THEN -1 ELSE 0 END) -(CASE WHEN DATENAME(dw, JD.JobDetailJobEnd) = 'Saturday' THEN -1 ELSE 0 END)) 
    from EmployeeDesignation sEM 
    Inner join JobLabour sJL on sJL.EmployeeDesignationID = sEM.EmployeeDesignationID 
) AS FullEmployeeRate 



from Job J 
Inner Join JobDetail JD on JD.JobID = J.JobID 
Inner Join JobLabour JL on JL.JobID = J.JobID 

WHERE J.JobActive = 0 

@ 쿼리 T-SQL에서 선언 한 변수. 이것이 가능한가?

+0

필요가 있는지 모르겠지만보기를 만드는 것이 더 쉽습니다. –

답변

10

당신은 당신의 T-SQL 여기

을 실행하는

EXECUTE sp_executesql @Query 

을 사용할 수 있습니다 (I은 MSSQL 2005 환경을 실행하고하는 것은) SQL Server에 대한 MS docn에 대한 링크의 2005

http://msdn.microsoft.com/en-us/library/ms188001%28v=sql.90%29.aspx

+1

너! 여러분, 학자입니까! –

+2

@JacquesBronkhorst - 팁 : 자리 표시자를 넣을 수 있습니다 (예 : '{CurrentUserId} '를 저장 쿼리에 저장합니다. 표에서 검색어를 검색 할 때 각 _snippet_을 적절한 값 (예 : '{CurrentUserId}'는 '42'일 수 있습니다. 이렇게하면 특정 사용자, 클라이언트, 작업 등의 특정 데이터를 반환하는 쿼리를 저장할 수 있습니다. – HABO

6

이전 답변을 사용하면 하나의 명령문을 실행할 수 있으며 유효합니다. 질문은 테이블에 저장된 SQL 문을 실행하는 방법에 관한 것이 었습니다. 이 추가 단계의 경우에는 실행해야하는 각 명령문을 반복하는 데 while 루프가 필요합니다.

-- Author: Chad Slagle 
DECLARE @Table table (RID BIGINT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
         SQLText NVARCHAR(MAX)) 

DECLARE @StatementMax INT 
     ,@statementMin INT 
     ,@isTest TINYINT = 1 
     ,@SQLStatement NVARCHAR(MAX) 
-- Insert SQL Into Temp Table 
INSERT INTO @table (SQLText) 
VALUES ('SELECT @@Version'); 
INSERT INTO @table (SQLText) 
VALUES ('SELECT SERVERPROPERTY(''ProductVersion'')') 
-- Get your Iterator Values 
SELECT @statementMAX = MAX(RID), @statementMIN = MIN(RID) FROM @table 

IF @isTest = 1 BEGIN SELECT *, @statementMax AS MaxVal, @StatementMin AS MinVal FROM @Table END 
-- Start the Loop 
WHILE @StatementMax >= @statementMin 
BEGIN 
    SELECT @SQLStatement = SQLText FROM @table WHERE RID = @statementMin  -- Get the SQL from the table 

    IF @isTest = 1 BEGIN SELECT 'I am executing: ' + @SQLStatement AS theSqlBeingRun, GETDATE(), @statementMin, @StatementMax END 
    ELSE 
    BEGIN 
     EXECUTE sp_ExecuteSQL @SQLStatement     -- Execute the SQL 
    END 
     DELETE FROM @table WHERE RID = @statementMin  -- Delete the statement just run from the table 
     SELECT @statementMIN = MIN(RID) FROM @Table  -- Update to the next RID 
    IF @isTest = 1 BEGIN SELECT * FROM @table END 

END 

요약하면, I는 임시 테이블을 생성하고, while 루프 반복자를 제공하는 IDENTITY (RID) 필드를 사용하여, 일부 SQL 넣어. 그런 다음 while 루프를 돌렸다. 이 예에서는 SQL 버전의 두 가지 뷰를 반환해야합니다. 나는 이것을 2k8에 만들었고 언젠가는 누군가가 잼에서 벗어날 수 있기를 바랍니다.

1

우리는 훨씬 더 간단한 방법을 사용합니다. 스크립트 (원시 SQL 또는 저장 프로시 듀어 호출)를이 스크립트의 식별 코드가 들어있는 열이있는 테이블에 저장하십시오. 스크립트에서 매개 변수에 자리 표시자를 사용하십시오. 많이 사용되는 스크립트는 앱 또는 웹 설정 파일에 "키 입력"할 수 있습니다. 스크립트를 특정 순서로 실행해야하는 경우 표에 서수 열을 넣으십시오. 그런 다음 실제 "스크립트"를 C# 목록 또는 배열로 가져 와서 데이터베이스 클래스 라이브러리에 전달하고 그에 따라 실행할 수 있습니다. 이렇게하면 SQL을 동적으로 제어 할 수 있으며 주 응용 프로그램을 다시 컴파일하지 않고도 스크립트에 대한 데이터베이스 측을 변경할 수 있습니다.

+0

보안 문제 또는 기타 이와 관련하여 단점이 있는지 궁금합니다. – GrumpyCrouton

관련 문제