我有一个简单的问题。设置管理多个SQL Server查询的最佳方法是什么?我对以下概念很满意。
Dim strtdate As String
Dim enddate As String
strtdate = DateTimePicker1.Value.ToString("mm/dd/yyyy")
enddate = DateTimePicker2.Value.ToString("mm/dd/yyy")
'MsgBox(strtdate)
Using con As New SqlConnection(connectionString)
Using cmd As SqlCommand = con.CreateCommand()
cmd.CommandText = "SELECT * FROM MyTable WHERE AsOfDate BETWEEN @noticestartdate END @noticeenddate"
cmd.Parameters.AddWithValue("@noticestartdate", strtdate)
cmd.Parameters.AddWithValue("@noticeenddate", enddate)
cmd.CommandType = CommandType.Text
Using sda As New SqlDataAdapter(cmd)
Using dt As New DataTable()
sda.Fill(dt)
DataGridView1.DataSource = dt
End Using
End Using
End Using
End Using
问题是,我希望能够创建几十个类似于上面的查询,但每个查询都会略有不同。我可以很好地创建所有SQL脚本。我只是不确定如何存储和检索我需要使用的所有查询。我绝对不想硬编码所有这些,并从DateTime Picker传递日期。我只是想了解如何创建一个SQL语句库,并使一切都很容易维护。我在考虑将查询名称存储在表中,以及我需要执行的SQL,但我不确定这是否可行。我应该创建几十个SProcs,并通过某种控制来调用它们吗?这似乎有点矫枉过正。我只想弄清楚设置和维护这个过程的最佳方法。
我的表格如下:
我的SQL Server表看起来像这样。
基本上......我在考虑感受' ReportName'进入ListBox
当用户选择报告时,例如Sum_Of_Deal_Balance_By_Month&#39;,我希望触发相关的SQL:declare @startDate datetime declare @endDate datetime declare @Name varchar(MAX) SELECT * FROM (SELECT Contact_ID, TB_Line, Deal_Balance, DATENAME(Month,[AsOfDate]) AS TheDate FROM [TBL_FR2052A_OperationalDepositTag_HIST] Where [AsOfDate] >= @startDate and [AsOfDate] <= @endDate) AS P PIVOT (SUM(DEAL_BALANCE) FOR TheDate in (January, February, March, April, May, June, July, August, September, October, November, December)) AS PV;
将传递到Excel并在Excel中创建一个小图表。我有工作代码示例,可以完成所有Excel的工作。我还不确定让用户创建Excel报告的最佳方法。我正在玩ListBox的想法,但也许有更好,更简单的方法来做到这一点。我在这里肯定愿意接受反馈!谢谢!
答案 0 :(得分:2)
存储过程可能是外部化SQL的最佳方法,但它不会简化部署。外部化ad-hoc SQL不会为您带来任何性能,只应在您的设计真正需要它时使用。这是一个部署和安全问题。
在内部实现它的一种简单方法是创建一类共享函数,缓存并返回所需的每个SQL调用的命令对象。我只是将SQL保留在代码中。另请查看Command.Prepare函数。如果在循环中调用查询并且不能使用sprocs,它可以大大提高性能。