动态 SQL 结果存入 SQL 存储过程中的临时表
代码如下:
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
问题是我想调用可以返回不同列的不同过程。 因此我必须通用地定义表#T1。 但我不知道怎么办。
谁能帮我解决这个问题吗?
The code is as follows:
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
The problem is that I want to call different procedures that can give back different columns.
Therefore I would have to define the table #T1 generically.
But I don't know how.
Can anyone help me on this problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
尝试一下:
这听起来真的很糟糕,就像 SQL 注入漏洞一样。
更正(根据 @CarpeDiem 的评论):
如果 sql 字符串不是过程,则省略
'execute'
Try:
And this smells real bad like an sql injection vulnerability.
correction (per @CarpeDiem's comment):
also, omit the
'execute'
if the sql string is something other than a procedure您可以动态定义表,就像动态插入表一样,但问题在于临时表的范围。 例如,以下代码:
将返回错误“无效的对象名称'#T1'”。 这是因为临时表#T1 是在比执行代码块“更低的级别”创建的。 为了解决这个问题,请使用全局临时表:
希望这有帮助,
杰西
You can define a table dynamically just as you are inserting into it dynamically, but the problem is with the scope of temp tables. For example, this code:
will return with the error "Invalid object name '#T1'." This is because the temp table #T1 is created at a "lower level" than the block of executing code. In order to fix, use a global temp table:
Hope this helps,
Jesse
请小心全局临时表解决方案,因为如果两个用户同时使用相同的例程,则可能会失败,因为所有用户都可以看到全局临时表...
Be careful of a global temp table solution as this may fail if two users use the same routine at the same time as a global temp table can be seen by all users...
动态创建名称中包含 GUID 的全局临时表。 然后您可以通过 dyn sql 在代码中使用它,而不必担心调用相同存储过程的另一个进程会使用它。 当您不知道每次运行时底层选定表会发生什么时,这非常有用,因此您无法事先显式创建临时表。 即 - 您需要使用 SELECT * INTO 语法
create a global temp table with a GUID in the name dynamically. Then you can work with it in your code, via dyn sql, without worry that another process calling same sproc will use it. This is useful when you dont know what to expect from the underlying selected table each time it runs so you cannot created a temp table explicitly beforehand. ie - you need to use SELECT * INTO syntax
尝试下面的代码,使用 T-SQL 从存储过程输出动态创建临时表
Try Below code for creating temp table dynamically from Stored Procedure Output using T-SQL
不确定我是否理解得很好,但也许你可以在字符串中形成 CREATE 语句,然后执行该字符串? 这样您就可以添加任意数量的列。
Not sure if I understand well, but maybe you could form the CREATE statement inside a string, then execute that String? That way you could add as many columns as you want.