选择后给表格命名

时间:2011-04-21 07:25:12

标签: sql-server select stored-procedures

在存储过程MS SQL中我的查询是:

SELECT *  
FROM ContentReportRequests a,UserPreferences d
WHERE  a.UserID = d.UserID and a.ID =@ID

我想给结果表一些名字。 我怎么能这样做?

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

4 个答案:

答案 0 :(得分:34)

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

如果您想要保留此结果集,以便在多个以后的查询中使用,您可能正在寻找SELECT INTO:

SELECT * into NewTableName
FROM ContentReportRequests a,UserPreferences d
WHERE  a.UserID = d.UserID and a.ID =@ID

其中NewTableName是新名称,并且将创建新的(永久)表。如果您希望该表在完成时消失,请在名称前加上#,以使其成为临时表。

或者,您可能只是想将其吸收到一个更大的查询中,在这种情况下,您将考虑将其作为子选择:

SELECT *
FROM (SELECT *  
FROM ContentReportRequests a,UserPreferences d
WHERE  a.UserID = d.UserID and a.ID =@ID
) NewTableName
WHERE NewTableName.ColumnValue = 'abc'

或CTE:

WITH NewTableName AS (
    SELECT *  
    FROM ContentReportRequests a,UserPreferences d
    WHERE  a.UserID = d.UserID and a.ID =@ID
)
SELECT * from NewTableName

最后,您可能正在谈论将结果集拉入例如ADO.Net DataTable,您希望自动设置名称。我不确定这是否可行。

答案 1 :(得分:2)

您可以使用table类型的变量。在此处阅读更多内容:Table Variables In T-SQL

答案 2 :(得分:1)

在存储过程中:

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

有点SILLY(或STUPID)您无法在结果集中命名表。 但是这样就可以在没有重复字节计数的情况下重复每一行中的表名。

仍有开销为每行传回NULL值。也许传递BIT值会更小......

另一种方法是始终使用column(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

即使查询返回零行,这些方法也会获取表名。

最后一次 ...每次FROM SQL STORED PROCEDURE(在您的代码的帮助下)自动命名数据集中的表的方法:

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

......大卫......

答案 3 :(得分:-2)

SELECT * AS MyTableName  
  FROM ContentReportRequests a, UserPreferences d  
 WHERE a.UserID = d.UserID and a.ID =@ID