2015-10-13 65 views
0

我想調用一個簡單的C#腳本作爲SQL過程的一部分,但似乎無法弄清楚。 有關如何獲得此功能的指示將非常棒。 在此先感謝在SQL過程中調用c#腳本

這是我的C#腳本,它只讀取在SQL過程中設置的.txt文件(@filename)的前30行,並將其輸出到新的.txt文件(文件.txt)SQL過程然後處理其餘的。

運行良好與硬編碼的@filename,但我需要它使用set @文件名從SQL程序文件中讀取和被調用,並從SQL過程

using System; 
using System.IO; 
using System.Linq; 

namespace GenericLoad 
{ 
    class ReadFromFile 
    { 
     static void Main() 
     { 
      if(File.Exists(file.txt)) 
      { 
       File.Delete(file.txt); 
      } 
      string[] lines = System.IO.File.ReadLines(@filename).Take (30). ToArray(); 
      foreach (string line in lines) 
      { 
       Console.WriteLine(line); 
       FileStream fs = new FileStream("file.txt", FileMode.Append); 
       TextWriter tmp = Console.Out; 
       StreamWriter sw = new StreamWriter(fs); 
       Console.SetOut(sw); 
       Console.WriteLine(line); 
       Console.SetOut(tmp); 
       sw.Close(); 
      } 
      //Console.ReadKey(); 
     } 
    } 

} 
+0

爲什麼你認爲這甚至有可能?您可以創建SQLCLR函數和過程,但在這種情況下,這是完全錯誤的,需要提升權限並禁用某些安全功能。你爲什麼不簡單地在你的應用程序中做所有的工作或者使用SSIS?如果你只想輸出一些行,爲什麼不使用bcp來導出它們? –

+0

如果你想從一個文件加載行,你應該嘗試BULK INSERT語句(https://msdn.microsoft.com/en-us/library/ms188365.aspx) –

+0

感謝您的評論,我準確地接近它那樣!並達到了一個更簡單和滿意的結果。 – NClelland

回答

0

運行所以我只是在文本文件的前30行的臨時表中使用了批量插入,然後決定標題

--Bulk insert first 30 lines of the finalreport.txt file into dbo.tmp_finalreportheader 

    SET @bulkCommand = ' BULK INSERT ' + DB_NAME() + '.dbo.tmp_finalreportheader 
    FROM ''' + @fileName + ''' 
    WITH (ROWTERMINATOR = ''\n'', 
      FIELDTERMINATOR = ''\t'', 
      DATAFILETYPE = ''char'', 
      MAXERRORS = 0, 
      FIRSTROW = 1, 
      LASTROW = 30)' 
    EXEC(@bulkCommand) 

    ALTER TABLE dbo.tmp_finalreportheader 
    ADD lineId INT IDENTITY(1,1) 

    PRINT 'dbo.tmp_finalreportheader table created' 

/************************************************************************************************************** 
Select the string from row n where the column headers are i.e. Name, ID... 
Using function dbo.BreakStringIntoRowsTab 
(where line = [DATA] + 1) 
**************************************************************************************************************/ 

    DECLARE @RowNumber INT = (SELECT lineId + 1 FROM dbo.tmp_finalreportheader WHERE line='[DATA]'); 
    DECLARE @Data INT=(SELECT lineId + 2 FROM dbo.tmp_finalreportheader WHERE line='[DATA]'); 

    SET @myString=(SELECT line FROM dbo.tmp_finalreportheader WHERE [email protected]) 

    IF OBJECT_ID('tempdb..#tmpHead') IS NOT NULL DROP TABLE #tmpHead 

    SELECT * 
    INTO #tmpHead 
    FROM dbo.BreakStringIntoRows(@myString); 

    SELECT @sqlColumns = COALESCE(@sqlColumns + ', ', '') + '[' + Headers + '] NVARCHAR(100)' FROM #tmpHead; 

    SELECT @sql = 'CREATE TABLE tmp_Import (' + @sqlColumns + ')'; 

    EXEC sp_executesql @sql