我有过滤SQL,返回具有不确定列数的查询,并希望在存储过程中使用结果。
DECLARE @RecordSelectionSql VARCHAR(MAX)
SET @RecordSelectionSql = (SELECT SQLQUERY FROM RecordSelection WHERE Id = @Id) + ' AND ([Active] = 1)'
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += ',' + CHAR(13) + CHAR(10) + CHAR(9) + name + ' ' + system_type_name
FROM sys.dm_exec_describe_first_result_set(@RecordSelectionSql, NULL, 0);
SELECT @sql = N'CREATE TABLE #TmpImport
(' + STUFF(@sql, 1, 1, N'') + '
);';
EXEC (@sql)
INSERT INTO #TmpImport
EXEC (@RecordSelectionSql)
然而我收到错误
Invalid object name '#TmpImport'.
如何正确编码此部分?
编辑:在RecordSelection上添加缺失条件
EDIT2: 我无法使用下面的代码,因为#TmpImport在执行@RecordSelectionSql后被销毁。
DECLARE @RecordSelectionSql AS VARCHAR(MAX)
SET @RecordSelectionSql = 'SELECT X.* INTO #TmpImport FROM ('
+ (SELECT SQLQUERY FROM RecordSelection WHERE Id = @Id) + ' AND ([Active] = 1) AS X'
EXEC (@RecordSelectionSql)
SELECT * FROM #TmpImport
给出相同的错误
Invalid object name '#TmpImport'.
答案 0 :(得分:5)
临时表仅在创建它们的会话中可用。使用Dynamic SQL,这意味着在运行Dynamic SQL后它不可用。您的选择是:
create table ##GlobalTemp
对于您的特定实例,您最好只执行一个select into
,它将根据所选数据生成您的表结构。
答案 1 :(得分:1)
选择临时表会容易得多。
例如
SELECT * INTO #TmpImport FROM SomeTable