动态SQL结果到临时表中的SQL存储过程
-
20-08-2019 - |
题
的代码如下所示:
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。 但我不知道怎么办。
谁能帮我这个问题?
解决方案
尝试:
SELECT into #T1 execute ('execute ' + @SQLString )
和该气味实像不良的SQL注入漏洞。
<强>校正强>(每@ CarpeDiem的评论):
INSERT into #T1 execute ('execute ' + @SQLString )
也,省略'execute'
如果SQL字符串是其他东西比的过程
其他提示
您可以动态定义的表就像你动态插入到它,但问题是与临时表的范围。例如,该代码:
DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE #T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO #T1 (Col1) VALUES ('This will not work.')
SELECT * FROM #T1
将与错误返回“无效的对象名称#T1'”。这是因为临时表#T1是在比执行代码的块“较低级”创建。为了固定,使用全局临时表:
DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO ##T1 (Col1) VALUES ('This will work.')
SELECT * FROM ##T1
希望这有助于 杰西
注意全局临时表的解决方案,就好像两个用户作为全局临时表的所有用户都可以看到同一时间使用相同的程序,这可能会失败......
在名称创建具有GUID全局临时表动态。然后你就可以在你的代码与它的工作,通过达因SQL,而不必担心其他进程调用存储过程同样会使用它。当你不知道该从底层选定表中的每个运行,所以你不能创建一个临时表显式地提前时间会发生什么,这非常有用。即 - 你需要使用SELECT * INTO语法
DECLARE @TmpGlobalTable varchar(255) = 'SomeText_' + convert(varchar(36),NEWID())
-- select @TmpGlobalTable
-- build query
SET @Sql =
'SELECT * INTO [##' + @TmpGlobalTable + '] FROM SomeTable'
EXEC (@Sql)
EXEC ('SELECT * FROM [##' + @TmpGlobalTable + '] ')
EXEC ('DROP TABLE [##' + @TmpGlobalTable + ']')
PRINT 'Dropped Table ' + @TmpGlobalTable
INSERT INTO #TempTable
EXEC(@SelectStatement)
DECLARE @EmpGroup INT =3 ,
@IsActive BIT=1
DECLARE @tblEmpMaster AS TABLE
(EmpCode VARCHAR(20),EmpName VARCHAR(50),EmpAddress VARCHAR(500))
INSERT INTO @tblEmpMaster EXECUTE SPGetEmpList @EmpGroup,@IsActive
SELECT * FROM @tblEmpMaster
CREATE PROCEDURE dbo.pdpd_DynamicCall
AS
DECLARE @SQLString_2 NVARCHAR(4000)
SET NOCOUNT ON
Begin
--- Create global temp table
CREATE TABLE ##T1 ( column_1 varchar(10) , column_2 varchar(100) )
SELECT @SQLString_2 = 'INSERT INTO ##T1( column_1, column_2) SELECT column_1 = "123", column_2 = "MUHAMMAD IMRON"'
SELECT @SQLString_2 = REPLACE(@SQLString_2, '"', '''')
EXEC SP_EXECUTESQL @SQLString_2
--- Test Display records
SELECT * FROM ##T1
--- Drop global temp table
IF OBJECT_ID('tempdb..##T1','u') IS NOT NULL
DROP TABLE ##T1
End
不知道如果我的理解很好,但也许你可以形成CREATE语句在字符串中,然后执行该字符串?这样一来,只要你想,你可以添加任意多列。
不隶属于 StackOverflow