在我的数据库中有一个存储过程。在该存储过程中,我从十个不同的表中检索数据。结果我得到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。所以我如何检索结果,但是通过存储过程使用表名
答案 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'
在此方法中,您可以将存储过程的每个元数据(如表名,排序和列友好名称)保存为扩展属性。