2011-04-21 9 views
8

En procedimiento almacenado MS SQL Mi consulta es:Dar nombre a la mesa después seleccione

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

me quieren dar la tabla de resultados algún nombre. ¿Cómo puedo hacer esto?

quiero tirar de él a ADO.Net DataSet.tables [ "name"]

+1

No está seguro de lo que están pidiendo aquí. Está seleccionando *, que devolverá todos los a. * Y todos los d. *. Si desea asignar nombres a los campos por separado, puede nombrarlos de forma independiente. – Blazes

+0

¿Cómo/dónde vas a usar este nombre? –

+1

Lo uso en .Net DataTable.tables ["NAME"] –

Respuesta

27

Me imagino algunas cosas que podría estar diciendo.

Si desea persistir este conjunto de resultados, para su consumo en varias consultas posteriores, es posible que se busca SELECT INTO:

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

Dónde NewTableName es un nuevo nombre y una nueva tabla (permanente) se ser creado. Si desea que esa tabla se vaya cuando haya terminado, prefija el nombre con un #, para que sea una tabla temporal.

Alternativamente, puede que a querer absorberlo en una sola consulta mayor, en cuyo caso se estaría buscando en lo que es una subselección:

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

o un CTE:

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

Finalmente, podría estar hablando de tirar del conjunto de resultados en, por ejemplo, un ADO.Net DataTable, y desea que el nombre se establezca automáticamente. No estoy seguro de que eso sea factible.

+0

¿ejecutarán los últimos dos ejemplos más tiempo de ejecución? –

+0

@Mark T: no deberían funcionar. El optimizador de consultas es bastante inteligente, y la abrumadora cantidad de tiempo va a ser de E/S (para cualquier cantidad decente de datos cuyo rendimiento va a ser una preocupación) –

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

esto no se compila. –

+0

No recuerdo la sintaxis exacta. Tal vez para poner AS ... parte al final. pero debería ser muy simple. –

2

Se puede utilizar una variable de tipo table. Lea más aquí: Table Variables In T-SQL

+0

, pero si lo inserto en la nueva tabla esto agregará o (n) al tiempo de ejecución –

+0

@ Mark Bueno, su pregunta no es muy específica en lo que desea. –

+0

Lo he editado para una mejor comprensión –

0

en el procedimiento almacenado:

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; 

en el código 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 

un poco tonto (o estúpido) que no se puede nombrar las tablas de un conjunto de resultados. Pero esto lo hace llegar sin un gran número de bytes que repite el nombre de la tabla dentro de cada fila.

Todavía hay sobrecarga pasando el valor NULO de vuelta para cada fila. Tal vez que pasa un valor de bit sería menor aún ...

y una alternativa es utilizar siempre la columna (0): en SQL:

select NULL "CustomerDetail", CustName,Addr1,Addr2... from CustomerDetail; 

en 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 

Estos métodos obtienen sus nombres de tablas incluso si la consulta devuelve cero filas.

pero el mejor para el último ...una manera de nombrar realidad las tablas de la base de datos de forma automática, cada vez DE PROCEDIMIENTO almacenados de SQL (con la ayuda de su código):

Dim ds As DataSet = Nothing 
ds = SqlExecute(); 
For Each dt As DataTable In ds.Tables 
    dt.TableName = dt.Columns(0).ColumnName 
Next 

Después de esto, se puede acceder a las tablas con el nombre de control dentro del procedimiento almacenado ... como debería haber sido desde el primer día!

EDIT: implementación selectiva: Nombre la primera columna en el patrón "TN: Cliente". Sus procedimientos heredados almacenados funcionan normalmente, solo impactando los procedimientos almacenados que desea modificar.

  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 

... David ...

Cuestiones relacionadas