我想要一个类似过程的东西,它将查询定义作为输入并输出一组包含查询的各个元素的表。
一个例子来说明我所说的解析器的含义:
输入示例(任何查询,真的:)
'select t1.col1,t2.col2
from table1 t1
inner join table2.col2
on t1.t2ref=t2.key'
当然,输出将是大量数据。我提到了表,但它可以是任何形式,例如 xml。这是上述查询的非常简单和任意分解示例:
tables_used:
+----+-----------+--------+------------+
| id | object_id | name | alias used |
+----+-----------+--------+------------+
| 1 | 43252345 | table1 | t1 |
| 2 | 6542625 | table2 | t2 |
+----+-----------+--------+------------+
columns_used:
+----------+-------------+
| table_id | column name |
+----------+-------------+
| 1 | col1 |
| 1 | t2ref |
| 2 | key |
| 2 | col2 |
+----------+-------------+
joins_used:
+-----+-----+-------+-----------------+
| tb1 | tb2 | type | on |
+-----+-----+-------+-----------------+
| 1 | 2 | inner | t1.t2ref=t2.key |
+-----+-----+-------+-----------------+
我不确定是否列出联接,但您可以像这样返回表和列。好麻烦啊
原始查询示例插入临时表,#Test:
SELECT TOP (10) p.[FirstName]
,p.[MiddleName]
,p.[LastName]
,pp.PhoneNumber into #Test
FROM [AdventureWorks2019].[Person].[Person] p
inner join [Person].[PersonPhone] pp on p.[BusinessEntityID] = pp.[BusinessEntityID]
创建一个名为 Test1 的存储过程:
CREATE PROCEDURE Test1
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT TOP (10) p.[FirstName]
,p.[MiddleName]
,p.[LastName]
,pp.PhoneNumber
FROM [AdventureWorks2019].[Person].[Person] p
inner join [Person].[PersonPhone] pp on p.[BusinessEntityID] = pp.[BusinessEntityID]
END
GO
这将返回 2 个结果集、表和列。
declare @colCt int
, @strCt varchar(3)
, @sql varchar(4000)
select @colCt=count(quotename([name]))
from tempdb.sys.columns
where OBJECT_ID = OBJECT_ID('tempdb..#Test')
set @strCt = cast(@colCt as varchar(3))
select distinct source_table
from sys.dm_exec_describe_first_result_set_for_object(
object_id('Test1'),1)
set @sql = 'select distinct top ' + @strCt + ' column_ordinal
, source_table
, [name]
from sys.dm_exec_describe_first_result_set_for_object(
object_id(''Test1''),1)
order by column_ordinal'
exec(@sql)