2013-07-27 11 views
6

E 'possibile eseguire un'istruzione SQL memorizzata in una tabella, con T-SQL?Come eseguire istruzioni SQL salvati in una tabella con T-SQL

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

Le dichiarazioni che sono memorizzati nella tabella sono dichiarazioni ad hoc che potrebbero essere selezionare Home 100 * FROM Atable a dichiarazioni più complesse:

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 

voglio eseguire il @ Query Variabile che ho dichiarato da T-SQL. È possibile? (Sto facendo funzionare un MSSQL 2005 ambiente)

+0

non so il vostro bisogno, ma sarebbe più facile per creare viste. –

risposta

10

È possibile utilizzare

EXECUTE sp_executesql @Query 

per eseguire il T-SQL

Ecco un link al MS docn per SQL Server 2005

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

+1

SI SIR! Sono un gentiluomo e uno studioso! –

+2

@JacquesBronkhorst - Suggerimento: puoi inserire segnaposti, ad es. '{CurrentUserId}', nelle query memorizzate. Quando recuperi la query dalla tabella, esegui la sostituzione di ogni _snippet_ con il valore appropriato, ad es. '{CurrentUserId}' potrebbe essere '42'. Ciò consente di avere query memorizzate che restituiscono dati specifici per un particolare utente, cliente, lavoro, .... – HABO

6

La risposta precedente consente di eseguire un'istruzione, ed è valido. La domanda era su come eseguire le istruzioni SQL memorizzate in una tabella, che ho preso come più di una dichiarazione eseguita. Per questo ulteriore passaggio, è necessario un ciclo while per iterare attraverso ogni istruzione che deve essere eseguita.

-- 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 

In sintesi, ho creato una tabella temporanea e mettere qualche SQL in esso, con un campo di identità (RID) per fornire un iteratore per il ciclo while. Quindi ha eseguito il ciclo while. Nell'esempio, dovresti restituire due viste della tua versione SQL. Ho costruito questo su 2k8, e spero che aiuta qualcuno fuori di un inceppamento uno giorno ..

1

Usiamo un approccio molto più semplice. Archiviare gli script (sql raw o chiamate stored procedure) in una tabella con una colonna contenente un codice identificativo per detto script. Usa segnaposti nello script per i parametri. Qualsiasi script che viene utilizzato molto può essere "digitato" nell'app o nel file di configurazione web. Se gli script devono essere eseguiti in un ordine specifico, inserire una colonna ordinale nella tabella. L'effettivo "script" può quindi essere inserito in un elenco o array C#, passato a una libreria di classi del database ed eseguito di conseguenza. Questo ti dà il controllo dinamico su SQL e ti permette di apportare modifiche sul lato del database per detti script senza ricompilare la tua applicazione principale.

+0

Sono curioso di sapere se ci sono degli svantaggi, problemi di sicurezza o altro? – GrumpyCrouton

Problemi correlati