在已执行的查询sql server中查找列名

时间:2014-07-23 07:02:39

标签: sql-server database sql-server-2008

我有一个存储SQL查询的表。我根据条件检索查询并将其存储在变量中:

---------------------------------------------------------
ID       |  Query
---------------------------------------------------------
1        | 'Select Id,Name from Student'
2        | 'Select Id,Name,Father_Name from Student'
3        | 'Select Id,Name,Email from Student_Detail'

....
---------------------------------------------------------

例如,变量@sql可能具有上面的第一个查询:

Declare @sql nvarchar(500)
set @sql = 'Select Id,Name from Student'

我使用:

执行此查询
Exec(@sql)

问题是,我如何知道该查询中使用了哪些列?我试图实现ColdFusion对query.ColumnList所做的事情,它会返回该查询中使用的列列表。

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT SUBSTRING(query,8,CHARINDEX('from',query)-9) AS ColumnList
FROM YourTable

答案 1 :(得分:-1)

这是mehdi lotfi解决方案的一个变体,但在某种意义上它同样很弱,只能提供select和from语句之间的任何内容,所以如果你有别名或计算或'case'语句它将无法正常工作;如果列列表是直接的逗号分隔列,它确实有效:

SELECT LEFT(REPLACE(@SQL,'Select ',''), CHARINDEX(' from',REPLACE(@SQL,'Select ',''))) AS ColumnList

答案 2 :(得分:-1)

最后,我设法使用此解决方案自行解决。

Declare @sql varchar(1000)
Declare @valueList nvarchar(500)
Declare @tbl Table(Name varchar(100))
Declare @selectPos Int
Declare @fromPos Int
Declare @len Int
Declare @pos Int
Declare @prevpos Int
Declare @Delimeter varchar(2)

set @sql = 'Select Id,Name,Father_Name from Student'
set @selectPos = CHARINDEX('Select ', @sql, 1)+7 
set @fromPos = CHARINDEX('From ', @sql, 1)
set @len = @fromPos - @selectPos

set @valueList = SUBSTRING(@sql, @selectPos, @len)

set @Delimeter = ', '
set @pos = 1
set @prevpos = 0

while @pos > 0
Begin
    set @pos = charIndex(@Delimeter, @valueList, @pos)
    If @pos = 0
    Begin
        Insert into @tbl
        Select SUBSTRING(@valueList,@prevPos + 1,LEN(@valueList) - @prevpos)
        Break;
    End
    Insert into @tbl
    Select SUBSTRING(@valueList,@prevPos + 1,@pos-@prevpos - 1)
    set @prevpos = @pos
    set @pos = @pos + 1
 End

 select * from @tbl