给名称表中存储过程MS SQL我的查询是:后选择
SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
我想给结果表中的一些名字。 我该怎么做?
我想将它拉到ADO.Net DataSet.tables [ “NAME”]
给名称表中存储过程MS SQL我的查询是:后选择
SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
我想给结果表中的一些名字。 我该怎么做?
我想将它拉到ADO.Net DataSet.tables [ “NAME”]
我可以想象你可能有一些意义。
如果你想坚持这个结果集,在多个以后的查询量,你可能会寻找SELECT INTO:
SELECT * into NewTableName
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
凡NewTableName
是一个新的名字,新的(永久)表将被创建。如果您希望表格在完成时消失,请使用#
作为该名称的前缀,使其成为临时表格。
或者,你可能只是想将它吸收到一个更大的查询,在这种情况下,你会看使其成为一个子查询:
SELECT *
FROM (SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
) NewTableName
WHERE NewTableName.ColumnValue = 'abc'
或CTE:
WITH NewTableName AS (
SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
)
SELECT * from NewTableName
最后,您可能正在讨论将结果集拉入例如一个ADO.Net DataTable,并且您想要自动设置该名称。我不确定这是否可行。
最后两个例子会执行更多的运行时间吗? – 2011-04-21 07:47:52
@Mark T - 他们不应该这样做。查询优化器相当聪明,绝大多数时间将是I/O(对于性能将成为问题的任何体面的数据量) – 2011-04-21 07:51:47
SELECT * AS MyTableName
FROM ContentReportRequests a, UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
这不能编译。 – 2011-04-21 07:39:09
我不记得确切的语法。也许把AS ......放在最后。但应该很简单。 – 2011-04-21 08:00:01
可以使用table
类型的变量。在这里阅读更多:Table Variables In T-SQL
但是如果我将它插入到新表中,这会将o(n)添加到运行时 – 2011-04-21 07:40:31
@Mark好吧,您的问题并不是非常具体。 – 2011-04-21 07:45:15
为了更好的理解我编辑了它 – 2011-04-21 08:27:23
在存储过程:
select CH.PrimaryKey, CH.Name,
NULL "CustomerHeader"
from CustomerHeader "CH";
--
select CD.PrimaryKey, CD.ShipTo,
NULL "CustomerDetail"
from CustomerDetail "CD";
--
select *, NULL "Orders"
from OrderTable;
在Vb.Net代码
:
Dim ds As DataSet = Nothing
ds = SqlExecute();
Dim dtCustHeader As DataTable = Nothing
Dim dtCustDetail As DataTable = Nothing
Dim dtOrders As DataTable = Nothing
For Each dt As DataTable In ds.tables
Select Case True
Case dt.Columns.Contains("CustomerHeader")
dtCustHeader = dt
Case dt.Columns.Contains("CustomerDetail")
dtCustDetail = dt
Case dt.Columns.Contains("Orders")
dtOrders = dt
End Select
Next
有点儿愚蠢(或愚蠢),你不能在命名结果集表。 但是这会让你在那里没有一个巨大的字节数在每一行中重复表名。
仍然有开销将NULL值传回给每一行。或许传递位值会更小但...
而且还有一个办法是经常使用的列(0): 在SQL:
select NULL "CustomerDetail", CustName,Addr1,Addr2... from CustomerDetail;
在vb.net:
Dim ds As DataSet = Nothing
ds = SqlExecute();
Dim dtCustHeader As DataTable = Nothing
Dim dtCustDetail As DataTable = Nothing
Dim dtOrders As DataTable = Nothing
For Each dt As DataTable In ds.Tables
Dim tblName As String = dt.Columns(0).ColumnName
Select Case tblName.ToUpper
Case "CUSTOMERDETAIL" : dtCustHeader = dt
Case "CUSTOMERDETAIL" : dtCustDetail = dt
Case "ORDERS" : dtOrders = dt
End Select
Next
即使查询返回零行,这些方法也会获取您的表名。
但最后为 ...办法其实自动命名的DataSet中的表,每次从SQL存储过程(从您的代码的帮助):
Dim ds As DataSet = Nothing
ds = SqlExecute();
For Each dt As DataTable In ds.Tables
dt.TableName = dt.Columns(0).ColumnName
Next
在此之后,你可以用你控制存储过程中的名称来访问你的表......应该从第一天开始!
编辑:选择性实现: 在模式“TN:Customer”中命名第一列。 您的传统存储过程正常工作,仅影响您希望修改的存储过程。
For Each dt As DataTable In mo_LastDataset.Tables
Dim tblName() As String = dt.Columns(0).ColumnName.Split(":")
If tblName.Length >= 2 AndAlso tblName(0).ToUpper = "TN" Then
dt.TableName = tblName(1)
End If
Next
... ...大卫
不知道你问这里。您正在选择*,这将返回所有。*和全部d。*。如果你想单独命名字段,那么你可以独立命名。 – Blazes 2011-04-21 07:29:52
你将如何/将在哪里使用这个名字? – 2011-04-21 07:34:00
我在.Net DataTable.tables中使用它[“NAME”] – 2011-04-21 07:38:26