代码如下:
ALTER PROCEDURE dbo.pdpd_DynamicCall
@SQLString varchar(4096) = null
AS
Begin
create TABLE #T1 ( column_1 varchar(10) , column_2 varchar(100) )
insert into #T1
execute ('execute ' + @SQLString )
select * from #T1
End
Run Code Online (Sandbox Code Playgroud)
问题是我想调用可以返回不同列的不同过程.因此,我必须一般地定义表#T1.但我不知道怎么做.
任何人都可以帮我解决这个问题吗?
背景:有一个存储过程,它使用给定名称的临时表来"填充".该过程是通用的,因为它检查临时表的模式,然后根据模式执行不同的"东西".我知道这有点奇怪,但我不愿意改变它,因为它在大多数情况下都能正常工作,除了....
如果我有一个存储过程,它为具有相同名称的临时表创建两个不同的模式.从逻辑上讲,它只根据IF的哪个分支创建一个临时表.问题是,当SQL Server检查Sproc时,似乎它正在评估IF的两端(如果它正在检查SQL语法,这是有意义的.)
所以这个SQL失败了:
IF (1=1)
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL
)
END
ELSE
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL,
c BIGINT NOT NULL
)
END
--exec SomeProcedureWhichDoesStuffWith#Test
DROP TABLE #test
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
消息2714,级别16,状态1,行14
数据库中已存在名为"#test"的对象.
ifs内部(create table DDL之前或之后)的drop table的组合似乎不满足sql检查器.
我有什么想法可以做到这一点?例如,我可以告诉SQL不执行语法检查并按原样接受sproc吗?