用于返回具有名称的表的存储过程

时间:2011-03-26 12:31:58

标签: sql-server stored-procedures

我可以在存储过程中返回一个带有名称的表吗?

3 个答案:

答案 0 :(得分:1)

否(假设我理解YASQ)

没有ThisTable()类型函数

这是一个像这样的常数

SELECT 'ThisTable' AS CurrentTableName FROM ThisTable^

答案 1 :(得分:1)

正如@gbn所说,无法“查询”使用的是哪些表名。您可以将它们作为常量返回。但表名仍然返回给客户端。对于每种类型的客户端,我都不能说这是肯定的,但这是一个使用ADO的例子。

以下是样本设置。

create table Tab1(Tab1ID int, Name varchar(10))
create table Tab2(Tab2ID int, Name varchar(10), Tab1ID int)

insert into Tab1 values(1, 'Name1')
insert into Tab2 values(1, 'Name2', 1)
insert into Tab2 values(2, 'Name2', 1)

查询

select *
from Tab1
  inner join Tab2
    on Tab1.Tab1ID = Tab2.Tab1ID

结果

Tab1ID      Name       Tab2ID      Name       Tab1ID
----------- ---------- ----------- ---------- -----------
1           Name1      1           Name2      1
1           Name1      2           Name2      1

在这种情况下,使用了两个表。查看实际返回给客户端的内容(使用ADO),您将看到此内容(转换为xml)。

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
    xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
    xmlns:rs='urn:schemas-microsoft-com:rowset'
    xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
    <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
        <s:AttributeType name='Tab1ID' rs:number='1' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='zz'
             rs:basetable='Tab1' rs:basecolumn='Tab1ID'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true'/>
        </s:AttributeType>
        <s:AttributeType name='Name' rs:number='2' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='zz' rs:basetable='Tab1'
             rs:basecolumn='Name'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='10'/>
        </s:AttributeType>
        <s:AttributeType name='Tab2ID' rs:number='3' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='zz'
             rs:basetable='Tab2' rs:basecolumn='Tab2ID'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true'/>
        </s:AttributeType>
        <s:AttributeType name='c3' rs:name='Name' rs:number='4' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='zz'
             rs:basetable='Tab2' rs:basecolumn='Name'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='10'/>
        </s:AttributeType>
        <s:AttributeType name='c4' rs:name='Tab1ID' rs:number='5' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='zz'
             rs:basetable='Tab2' rs:basecolumn='Tab1ID'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true'/>
        </s:AttributeType>
        <s:extends type='rs:rowbase'/>
    </s:ElementType>
</s:Schema>
<rs:data>
    <z:row Tab1ID='1' Name='Name1' Tab2ID='1' c3='Name2' c4='1'/>
    <z:row Tab1ID='1' Name='Name1' Tab2ID='2' c3='Name2' c4='1'/>
</rs:data>
</xml>

数据在rs:data标记中返回。在s:Schema中,您会发现返回的所有列都包含有关该列的一些元数据,其中包含rs:basetable,其中包含您要查询的表的名称。您可以使用Recordset Object获取结果集中每列的基表名称。

答案 2 :(得分:0)

查找OUTPUT参数和RETURN值。存储过程可以从表中选择数据,分配可以反馈给调用过程并通过名称引用的参数值,还可以向调用过程返回一个值。

http://support.microsoft.com/kb/262499

http://msdn.microsoft.com/en-us/library/ms188001.aspx