2011-04-21 73 views
8

给名称表中存储过程MS SQL我的查询是:后选择

SELECT * 
FROM ContentReportRequests a,UserPreferences d 
WHERE a.UserID = d.UserID and a.ID [email protected] 

我想给结果表中的一些名字。 我该怎么做?

我想将它拉到ADO.Net DataSet.tables [ “NAME”]

+1

不知道你问这里。您正在选择*,这将返回所有。*和全部d。*。如果你想单独命名字段,那么你可以独立命名。 – Blazes 2011-04-21 07:29:52

+0

你将如何/将在哪里使用这个名字? – 2011-04-21 07:34:00

+1

我在.Net DataTable.tables中使用它[“NAME”] – 2011-04-21 07:38:26

回答

27

我可以想象你可能有一些意义。

如果你想坚持这个结果集,在多个以后的查询量,你可能会寻找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,并且您想要自动设置该名称。我不确定这是否可行。

+0

最后两个例子会执行更多的运行时间吗? – 2011-04-21 07:47:52

+0

@Mark T - 他们不应该这样做。查询优化器相当聪明,绝大多数时间将是I/O(对于性能将成为问题的任何体面的数据量) – 2011-04-21 07:51:47

-2
SELECT * AS MyTableName 
    FROM ContentReportRequests a, UserPreferences d 
WHERE a.UserID = d.UserID and a.ID [email protected] 
+0

这不能编译。 – 2011-04-21 07:39:09

+0

我不记得确切的语法。也许把AS ......放在最后。但应该很简单。 – 2011-04-21 08:00:01

2

可以使用table类型的变量。在这里阅读更多:Table Variables In T-SQL

+0

但是如果我将它插入到新表中,这会将o(n)添加到运行时 – 2011-04-21 07:40:31

+0

@Mark好吧,您的问题并不是非常具体。 – 2011-04-21 07:45:15

+0

为了更好的理解我编辑了它 – 2011-04-21 08:27:23

0

在存储过程:

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 

... ...大卫