2010-07-12 37 views
3

我这是写在C#中的存储过程:无论如何将c#函数转换为sql server存储过程?

SqlConnection scn = new SqlConnection("context connection=true;"); 
     SqlCommand scm = new SqlCommand("Select * from EPMS_Filters",scn); 
     SqlDataAdapter sda = new SqlDataAdapter(scm); 
     DataSet ds = new DataSet(); 


     //template for select Query. 
     String SelectQry = "select convert(varchar,TimeStamp,101) as TimeStamp, avg({0} from EPMSDataTable where timestamp between '{1}' and '{2}' group by convert(varchar,timestamp,101)"; 
     String filters = ""; 

     //select clause part which contains simple columns select col1, col2... 
     sda.SelectCommand.CommandText = "Select column_name from information_schema.columns where table_name = 'EPMSDataTable' and column_name <> 'timestamp'"; 
     sda.Fill(ds, "SimpleFilters"); 
     foreach (DataRow dr in ds.Tables["SimpleFilters"].Rows) 
     { 
      String fName = dr[0].ToString(); 
      filters += dr[0] + ")as " + dr[0] + ", avg("; 
     } 

     filters = filters.TrimEnd(", avg(".ToCharArray()); //remove last ',' 

     scm.CommandText = String.Format(SelectQry,filters,start.ToString(),end.ToString()); 
     scn.Open(); 
     SqlContext.Pipe.Send(scm.ExecuteReader()); 
     scn.Close(); 

反正是有或某些工具,可以将此代码转换为SQL存储过程的代码?还是我必须手工重写? 我问的原因是,例如,我不知道如何处理将数据集变量转换为sql类型..

谢谢!

格雷格

+0

你将不得不手动重写。 – 2010-07-12 11:29:25

回答

1

您必须手动重写它。这并不难。

通过您的DataTable中的循环,你将与一个光标,像这样的东西替换:

SET NOCOUNT ON; 

DECLARE ohno_a_cursor CURSOR FAST_FORWARD FOR 
Select column_name from information_schema.columns where table_name = 'EPMSDataTable' and column_name <> 'timestamp' 

DECLARE @colname nvarchar(max); 

OPEN ohno_a_cursor; 
FETCH NEXT FROM ohno_a_cursor INTO @colname 
WHILE @@FETCH_STATUS = 0 BEGIN 
    SET @Filters = @Filters + '(whatever'); 
END 

CLOSE ohno_a_cursor; 
DEALLOCATE ohno_a_cursor; 
1

答案是否定的,其不可能的,任何自动化的过程将能够把这一C#为SQL存储过程。

相关问题