我有一个存储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
所做的事情,它会返回该查询中使用的列列表。
答案 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