【发布时间】:2020-01-30 22:12:35
【问题描述】:
有没有办法从复杂的查询结果集中创建表? 一个参数将包含一个查询,我需要接受这个查询并将结果放入一个临时表中。
我让它用于一个简单的查询
Declare @Src nvarchar(4000)='Select Distinct a,b,c from mytable'
Declare @newId VARCHAR(50)
SELECT @newId = REPLACE(CONVERT(VARCHAR(50),NEWID()),'-','')
-- Make sure the table doesn't exist... if does we need to delete it.
IF OBJECT_ID('TMP_' + @newId) IS NOT NULL
BEGIN
SET @SQLStr = 'DROP TABLE TMP_' + @newId
EXEC (@SQLStr)
END
-- I might need the structucture or the result set or the results in the tmp table.
SET @SQLStr = 'SELECT * INTO TMP_' + @newId + ' FROM (' + @SRC + ') S WHERE 1=0'
EXEC(@SQLStr)
但是如果@src 带有“order by”或带有子查询会怎样
Select a,b,c from mytable order by a,b
我需要找到“from”并在其前面添加“to 'TMP_' + @newId',但这并不安全,因为您可以在 select 的字段部分中包含子查询。
我尝试使用sp_describe_first_result_set @Tsql=@Src,但据我所知,我需要在游标中解析结果以构建创建表语句并执行它,然后我可以使用以下方法插入复杂查询:
EXEC('Inset into tmp_'+ @newId + '
exec('+@src+')');
还有其他方法可以简化吗? 我正在尝试找到适用于所有版本 SQL 服务器(快速或标准)的解决方案。
【问题讨论】:
-
除非您想显着简化假设,否则简短的回答是否定的。如果您允许任何选择查询作为起点,那么您有一个非常非常复杂的目标,即解析查询并在字符串中找到正确的位置以注入您的 into 子句。涉及简单 CTE 的查询将是一个挑战。而 TSQL 不太适合这种情况。
-
并且注意“version”和“edition”是不一样的;两者都会影响可能限制任何解决方案的功能。
标签: sql-server tsql