2011-08-27 30 views
1

我是新來的,英文不是我的母語,所以我希望你們能理解我。有人有一個例子,如何在SQL Server 2008中執行CLR插入?

有人可以給我一個如何使用嵌套循環的結果創建一個數據表的函數的例子。

我試圖做一個SQL CLR函數在C#中創建一個表,用於彩票遊戲的所有組合,我有以下PASCAL代碼:

program lotery; 
uses fdelay, crt; 
var 
    x,y,z,a,b,c:integer; 
    cont:longint; 
begin 
    clrscr; 
    x:=0; 
    y:=0; 
    z:=0; 
    a:=0; 
    b:=0; 
    c:=0; 
    cont:=0; 
    for x:=0 to 59 do 
     begin 
       for y:=x+1 to 59 do 
       begin 
        for z:=y+1 to 59 do 
        begin 
         for a:=z+1 to 59 do 
         begin 
          for b:=a+1 to 59 do 
          begin 
            for c:=b+1 to 59 do 
            begin 
             cont:=cont+1; 
       Writeln ('Dezenas: ',x,' - ',y,' - ',z,' - ',a,' - ',b,' - ',c,' = Total de Dezenas: ',cont); 
            end; 
          end; 
         end; 
        end; 
       end; 
     end; 
readkey; 
end. 

僅使用T-SQL我注意到,我不能做whilewhile嵌套循環。所以我試圖做一個SQL CLR函數,但我不知道從哪裏開始。

我使用的是SQL Server 2008和Visual Studio 2010中

我在看MSDN的例子,但多數情況下它們的不工作,都是如此混亂。

附錄2011年8月29日

我正在學習這個網站是如何工作的現在也,很抱歉,如果我不能做關於這個問題的增編,我只看到在主要問題

編輯選項

我有一個工作的C++(這個我編譯使用DEV C++)代碼做一個txt的所有組合,我的繼承人代碼:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
    { 

     ofstream myfile; 
     myfile.open ("Combinacoes.txt"); 

     int total = 0; 

     for (int contador = 1; contador <= 60; contador++) 
      for (int Bola_01 = 1; Bola_01 <= 60; Bola_01++) 
       for (int Bola_02 = 1; Bola_02 <= 60; Bola_02++) 
        for (int Bola_03 = 1; Bola_03 <= 60; Bola_03++) 
         for (int Bola_04 = 1; Bola_04 <= 60; Bola_04++) 
          for (int Bola_05 = 1; Bola_05 <= 60; Bola_05++) 
           for (int Bola_06 = 1; Bola_06 <= 60; Bola_06++) 
            { 
            total = Bola_01 + Bola_02 + Bola_03 + Bola_04 + Bola_05 + Bola_06; 
            myfile << Bola_01 << "," << Bola_02 << "," << Bola_03 << "," << Bola_04 << "," << Bola_05 << "," << Bola_06 << "," << total << endl; 
//         printf ("%d , %d , %d , %d , %d , %d , %d \n", Bola_01, Bola_02, Bola_03, Bola_04, Bola_05, Bola_06, total); 
            total = 0; 
            } 
     return 0; 
    } 

然後我就可以導入此數據使用DTS SQL,我的目標是有一個CLR可以在SQL中完成所有工作,並可以快速縮小組合表使用調用C++代碼作爲DLL(或者換句話說使用CLR)的函數來裝載數據庫並快速重建。 另一點是我將在這個組合表上做很多搜索(選擇我將使用TSQL並將結果發送到C#中的數組),而且我也有搜索數據的抽獎結果,案例(組合和結果)我需要使用數組來完成我的研究,這是與CLR一起工作的另一點,我在大學期間記得C++提供的許多東西,而且我的思想非常簡單快速的工作用C#代替我的目標使用TSQL遊標。 我的想法是用C#和TSQL程序來做SQL數據庫,以使我可以在彩票支出每週花費大約50美元時玩最好,最快的提示,我正在閱讀的第一本書是:

如何在蓋爾·霍華德贏得抽獎

不知道正確的英文名稱。

我會使用許多其他系統從博客和網站,但只有那些我可以理解的,對我來說,沒有一點使用複雜公式的程序,我不明白。

感謝所有的答案,我會繼續嘗試讓CLR爲我工作,而不是每次都需要使用DTS導出和導入數據,並且非常感謝Martin Smith爲我演示瞭如何模擬一個嵌套的while循環的MSSQL,我遇到了內存問題(我的筆記本電腦有MSSQL,使用2048 MB可用RAM到SQL):

執行批處理時發生錯誤。錯誤信息是:異常做出'System.OutOfMemoryException'foio acionada。

但錯誤是工作之前相當不錯,而且我敢肯定,如果在Microsoft SQL考試的問題問,如果一個嵌套的循環是可能出現的,我將與你的榜樣;-p

+0

你需要它在數據庫中嗎?看看在http://stackoverflow.com/questions/1157070/any-best-practice-of-doing-table-record-insert-with-sql-clr-store-procedure做它從客戶端進程從c# 。 –

+0

您是否需要創建表格或將數據存儲在表格中?更重要的是你必須做循環?你能接受一個不使用循環的SQL答案嗎? –

+0

最後 - 你可以發佈你嘗試過的SQL嗎? –

回答

5

回答只是簡要說明標題中的問題,有一個使用CLR程序在MSDN here上執行INSERT的示例。

但是已經讀過這個具體問題的動機只是首先指出你可以可以在TSQL中嵌套WHILE循環。

雖然這不會達到您的目標的有效方式。你需要一個有59個號碼的數字表,然後加入6次,以基於集合的方式進行。

假設每個球只能出現一次,順序並不重要,那麼

/*Table to Hold the Number Combinations*/ 
CREATE TABLE dbo.LotteryNumbers 
    (
     Number1 INT NOT NULL , 
     Number2 INT NOT NULL , 
     Number3 INT NOT NULL , 
     Number4 INT NOT NULL , 
     Number5 INT NOT NULL , 
     Number6 INT NOT NULL , 
     CONSTRAINT PK_LotteryNumbers PRIMARY KEY CLUSTERED 
     (Number1, Number2, Number3, Number4, Number5, Number6) 
    ) 


/*Create helper table to hold the ball numbers*/ 
DECLARE @Balls TABLE (N INT PRIMARY KEY) 

;WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1), 
     E02(N) AS (SELECT 1 FROM E00 a, E00 b), 
     E04(N) AS (SELECT 1 FROM E02 a, E02 b), 
     E08(N) AS (SELECT 1 FROM E04 a, E04 b) 

    INSERT INTO @Balls(N) 
      SELECT TOP 59 
        ROW_NUMBER() OVER (ORDER BY N) 
      FROM E08 

    /*Populate the table of lottery numbers*/ 
INSERT INTO dbo.LotteryNumbers 
     SELECT T1.N , 
       T2.N , 
       T3.N , 
       T4.N , 
       T5.N , 
       T6.N 
     FROM @Balls T1 
       JOIN @Balls T2 ON T1.N < T2.N 
       JOIN @Balls T3 ON T2.N < T3.N 
       JOIN @Balls T4 ON T3.N < T4.N 
       JOIN @Balls T5 ON T4.N < T5.N 
       JOIN @Balls T6 ON T5.N < T6.N 

注意:如果你看的執行計劃這一點,你會看到SQL Server不會有效地編寫嵌套循環程序爲你。

Plan

+0

男人,我喜歡你的榜樣,我遇到了一個類似如下內存的問題: 執行批處理時發生錯誤。錯誤信息是:異常做出'System.OutOfMemoryException'foio acionada。 但在錯誤發生之前工作相當不錯,顯示結果。 我用更多信息更新了主要問題,感謝您的幫助。 – Wisdown

+0

@Wisdown - 我已經更新了它。花費大約11分鐘在我的舊臺式機上運行。 –

相關問題