也許你的做法是錯誤的,我會深入詳細的一段時間,但它似乎是你的問題可以通過SSIS
來解決 - 更新答案:
首先,大圖片:
動態處理表的最經濟實惠的方法是使用腳本而不是存儲過程。如果你想隨機選擇表訪問,你肯定不會使用存儲過程的任何性能優勢,即執行計劃。 SQL腳本可以很容易地升級,在運行時使用佔位符指向一個表並在執行前替換它。
該腳本可以從文件系統,變量,表格中的文本列等加載。加載過程包括將腳本內容讀取到字符串變量。這一步發生一次。
下一步是準備階段。該步驟將針對每個要處理的表執行。此步驟的主要業務是用正在處理的當前表替換表佔位符。還可以設置參數值,如可能需要傳遞到您已寫入的sp中的任何參數。
最後一步是腳本的執行。由於已經加載到一個變量中,並且佔位符被設置爲當前表名,所以可以安全地調用ExecuteSQLTask並將sql變量作爲輸入。這個過程當然會發生在你想要處理的每個表上。
好的。現在讓我們看看這是行動。
這是一個樣的數據庫模型:
CREATE TABLE [dbo].[t_n](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[start] [datetime] NULL,
CONSTRAINT [PK_t_n] PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY]
其中t_n代表任意表(T_1,T_2,T_3等)。
這是當前的存儲過程:
CREATE PROCEDURE SpProcessT_n
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM [t1];
END
GO
現在,轉換此存儲過程SQL腳本,放置一個佔位符,而不是表名的
SET NOCOUNT ON;
SELECT * FROM [$table_name];
我選擇把它保存在文件系統中的.sql文件以儘可能簡化POC。
接下來,創建一個SSIS包這樣的:
這些都是我選擇設置循環設置:
這是你可以分配表的方式名稱改爲正確調用_table_name_
這是腳本任務的設置,在這裏您可以找到該變量_table_name_已只讀訪問,而一個叫做SQLEXEC新的變量讀/寫訪問:
,這是它的主要功能:
public void Main()
{
String Table_Name = Dts.Variables["table_name"].Value.ToString();
String SqlScript;
Regex reg = new Regex(@"\$table_name", RegexOptions.Compiled);
using (var f = File.OpenText(@"c:\sqlscript.sql")) {
SqlScript = f.ReadToEnd();
f.Close();
}
SqlScript = reg.Replace(SqlScript, Table_Name);
Dts.Variables["SqlExec"].Value = SqlScript;
Dts.TaskResult = (int)ScriptResults.Success;
}
可以注意到DTS變量SqlExec包含將被執行的sql腳本。現在,你可以在你的ExecuteSqlTask設置以下選項:
在MSSQL 2008年試驗成功,如果你把一個插入腳本文件裏面,你會發現每個表中新行。
希望這會有所幫助!
那麼,MrTelly,你只接受了你在這裏問過的50個問題中的一半的答案,所以我對繼續嘗試幫助你的興趣水平相當低。 – DOK 2011-06-04 11:35:04
您是否需要檢查每個表格中的整個數據還是僅檢查一些行?這個過程是否在某一時刻運行?如果是這樣,批處理將處理相同的表/行? – Rodrigo 2011-06-07 02:32:01
我明白你的觀點,@MrTelly。但請理解,那些試圖建立自己聲譽的人可能會花費大量時間和思想來研究和迴應像你這樣一個相當具有挑戰性的問題,因爲他們的努力獲得獎勵的可能性似乎很低。即使現在有了獎勵,你會有什麼獎勵嗎?我只是想幫助你在這裏擺脫現實。 – DOK 2011-06-07 08:21:20