2012-08-06 27 views
1

我有動態SQL存儲在SQL表中,我必須在特定條件下執行。目前,我們使用遊標來爲我們處理這個問題,但我總是被告知儘可能避免使用遊標,因爲它們不是最有效的方式。所以,我的問題是:如何在沒有它們的情況下執行動態SQL(如果有方法)?整個系統是圍繞這個動態的SQL混亂建立的,所以不會改變它。是否有更好的方法來執行不使用遊標的動態SQL?

爲此,假設表格中有Id AS IDENTITYSQL AS VARCHAR字段,其​​中SQL字段包含要執行的SQL(顯然)。

編輯: 基本上,我想遍歷表並執行SQL列中的SQL。

因此,在表中的行會基本上是這樣的:

ID SQL 
-- ---------------------- 
1 SELECT * FROM RECORD 
2 SELECT * FROM PERSON 
3 SELECT * FROM LOCATION 

我還沒有編寫任何代碼,因爲我會寫一個光標在表遍歷並執行它。我只是不知道的循環表並執行該字符串不是像其他SQL查詢的任何其他方式:

DECLARE @sql VARCHAR(MAX) 

DECLARE _cursor CURSOR 
FOR 
    SELECT [SQL] 
    FROM #tmp2 

OPEN _cursor 

FETCH NEXT FROM _cursor INTO @sql 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     PRINT (@sql) 
    END 
CLOSE _cursor 
DEALLOCATE _cursor 
+6

動態SQL和遊標是正交的概念 - 一個對另一個沒有影響。是的,他們可能會聚集在您的代碼庫中,但沒有固有的連接。發佈一些代碼,以便我們可以瞭解鏈接。 – Oded 2012-08-06 18:09:54

+2

看到你的代碼會有幫助。除非實際使用遊標中的動態SQL,否則動態SQL和遊標無關。 – LittleBobbyTables 2012-08-06 18:10:00

+0

我知道他們彼此沒有任何關係,我只是不知道另一種方式來循環表,*不使用它們,並執行動態SQL。 – Yatrix 2012-08-06 18:22:47

回答

3

您可以使用任意數量的串聯技巧在不使用光標的情況下製作一個大批量,我個人使用FOR XML技巧。

這裏是一個概述:

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

但是,光標(同時一般一個代碼味道)是不會一個可怕的量有助於此非性能。你將有機會處理錯誤等比單一批次更容易。

另外,如果您在某些語句中有DDL,這些語句必須是批處理中的第一條語句,那麼您需要分別提交它們。 EXEC或sp_executesql不執行任何批量分割,如SSMS具有GO批分隔符。

+0

我不想通過sp_executesql在表中考慮DDL。請刪除! :) – podiluska 2012-08-06 19:16:57

+0

@podiluska此結構等同於您可能在代理中執行的作業步驟。因此,認爲人們可以創建一個表,從一個導入中填充它,處理它然後刪除這個表,這是完全合理的。如果使用得當,構造沒有任何問題。 – 2012-08-06 19:23:15

2

忽略在這整個架構中的根本缺陷....

declare @sql nvarchar(max) 
    select @sql = '' 
    select @sql = @sql + SQL + ';' from #tmp2 

    exec sp_executesql @sql 

至少我們已經擺脫了現在你的光標:)

編輯:代碼爲我工作...

create table #tmp2 (sql nvarchar(100)) 
insert #tmp2 values ('select * from sysobjects') 
insert #tmp2 values ('Select * from sysColumns')  
declare @sql nvarchar(max) 
    select @sql = '' 
    select @sql = @sql + SQL + ';' from #tmp2  
    exec sp_executesql @sql   
drop table #tmp2 
+0

相信我,夥計們,這是一個噩夢。整個應用程序依賴於這個結構,所以它不是我們可以拆卸和替換的東西。我們必須重新設計並重新編寫幾乎所有的代碼,這不是一種選擇。 – Yatrix 2012-08-06 18:57:02

+0

這就是生活,不是嗎。你的工作市場如何? :) – podiluska 2012-08-06 18:57:44

+0

蓬勃發展......我看到你在那裏做了什麼。 =) – Yatrix 2012-08-06 18:58:47

相關問題