TSQL 中的 TSQL 查询解析器

问题描述 投票:0回答:1

我想要一个类似过程的东西,它将查询定义作为输入并输出一组包含查询的各个元素的表。

在互联网上搜索这一点,我得到了各种编程语言的大量结果,但 tsql 本身却没有。有这样的资源吗

一个例子来说明我所说的解析器的含义:

输入示例(任何查询,真的:)

'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 |
+-----+-----+-------+-----------------+
sql-server t-sql parsing
1个回答
0
投票

我不确定是否列出联接,但您可以像这样返回表和列。好麻烦啊

原始查询示例插入临时表,#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)
© www.soinside.com 2019 - 2024. All rights reserved.