如何在select查询中返回包含列的表名

时间:2014-07-27 12:40:48

标签: sql sql-server

在我的数据库中有一个存储过程。在该存储过程中,我从十个不同的表中检索数据。结果我得到10个表。我的问题是,有什么办法让我可以返回表名。因为这个SP我正在从我的vb.net项目执行并将此结果存储在一个数据集中。我正在合并此存储过程的结果,即此存储过程中的表到我的数据集中的表。所以我合并这个表格为     dataset1.tables( “表1”)。合并(dataset2.tables(0))

所以现在我想这样做,我必须给存储过程的结果提供表名。所以我可以将表与表名合并而不是表索引,即表(0)。

我应该通过存储过程检索这样的结果。

我有像

这样的存储过程
create proc sp_QM_INVOICE_MATBATCHWISE_DETAILS
    @PLANT_CODE NUMERIC(5,0),
    @COMPANY_CODE NUMERIC(5,0),
    @FYEAR NUMERIC(5,0),
    @STRANSID VARCHAR(15),
    @SMODE VARCHAR(5),
    @DOC_NO VARCHAR(20),
    @INVOICE_NO VARCHAR(20),
    @CUSTOMER_NO VARCHAR(20)
    AS
    BEGIN
    SELECT * FROM QM_INVOICEMATWISE_DETAILS
    WHERE COMPANY_CODE=@COMPANY_CODE 
    AND PLANT_CODE=@PLANT_CODE
    AND FYEAR=@FYEAR
    AND DOC_NO=@DOC_NO
    AND INVOICE_NO=@INVOICE_NO
    AND CUSTOMER_NO=@CUSTOMER

    SELECT * FROM QM_INVOICEMATBATCHWISE_DETAILS
    WHERE COMPANY_CODE=@COMPANY_CODE 
    AND PLANT_CODE=@PLANT_CODE
    AND FYEAR=@FYEAR
    AND DOC_NO=@DOC_NO
    AND INVOICE_NO=@INVOICE_NO
    AND CUSTOMER_NO=@CUSTOMER

    SELECT * FROM QM_TESTCERTIFICATEFORMATCUST_T
    WHERE COMPANY_CODE=@COMPANY_CODE 
    AND PLANT_CODE=@PLANT_CODE
    AND FYEAR=@FYEAR
    AND DOC_NO=@DOC_NO
    AND INVOICE_NO=@INVOICE_NO
    AND CUSTOMER_NO=@CUSTOMER

END

那么我如何在结果中使用表名检索此结果。 当我通过我的代码执行这个存储过程时,我在一个数据集中检索这个结果。在数据集中,表就像Table1,Table2,Table3。所以我如何检索结果,但是通过存储过程使用表名

2 个答案:

答案 0 :(得分:1)

您可以在SQL Server本身中将它们联合起来,只使用一个表:

create proc sp_QM_INVOICE_MATBATCHWISE_DETAILS
@PLANT_CODE NUMERIC(5,0),
@COMPANY_CODE NUMERIC(5,0),
@FYEAR NUMERIC(5,0),
@STRANSID VARCHAR(15),
@SMODE VARCHAR(5),
@DOC_NO VARCHAR(20),
@INVOICE_NO VARCHAR(20),
@CUSTOMER_NO VARCHAR(20)
AS
BEGIN
SELECT *, 'QM_INVOICEMATWISE_DETAILS' TableName FROM QM_INVOICEMATWISE_DETAILS
WHERE COMPANY_CODE=@COMPANY_CODE 
AND PLANT_CODE=@PLANT_CODE
AND FYEAR=@FYEAR
AND DOC_NO=@DOC_NO
AND INVOICE_NO=@INVOICE_NO
AND CUSTOMER_NO=@CUSTOMER

SELECT *, 'QM_INVOICEMATBATCHWISE_DETAILS' TableName FROM QM_INVOICEMATBATCHWISE_DETAILS
WHERE COMPANY_CODE=@COMPANY_CODE 
AND PLANT_CODE=@PLANT_CODE
AND FYEAR=@FYEAR
AND DOC_NO=@DOC_NO
AND INVOICE_NO=@INVOICE_NO
AND CUSTOMER_NO=@CUSTOMER

SELECT *, 'QM_TESTCERTIFICATEFORMATCUST_T' TableName  FROM QM_TESTCERTIFICATEFORMATCUST_T
WHERE COMPANY_CODE=@COMPANY_CODE 
AND PLANT_CODE=@PLANT_CODE
AND FYEAR=@FYEAR
AND DOC_NO=@DOC_NO
AND INVOICE_NO=@INVOICE_NO
AND CUSTOMER_NO=@CUSTOMER

<强>更新

由于您希望按名称引用一堆表,您需要读取每个表的第一行(字段TableName)并设置每个数据表的属性TableName

调用程序后,您应该运行:

for each tbl in dataset1.tables 
   if tbl.Rows.Count > 0
      tbl.TableName = tbl.Rows(0)("TableName")
   end if
next

例如,您可以将它们引用为dataset1.tables("QM_TESTCERTIFICATEFORMATCUST_T")

如果您知道在存储过程中引用它们的顺序,您可以在vb.net中对表的名称进行硬编码,并避免在空表的情况下发生的问题。

答案 1 :(得分:0)

您可以对存储过程使用Extended属性,以便定义存储过程的结果集元数据,并使用以下查询获取此信息:

SELECT ep.name, ep.value
FROM sys.procedures p
INNER JOIN sys.extended_properties ep ON p.object_id = ep.major_id
WHERE p.name = 'YourProcedure'

在此方法中,您可以将存储过程的每个元数据(如表名,排序和列友好名称)保存为扩展属性。