0

我正在编写一个存储过程(SQL Server),它接收代表其他存储过程名称的字符串参数。这个字符串还包含所有存储的参数,所以为了运行它,我只需要编写EXEC @vSpCommand.

现在我的问题来了:我的程序应该能够处理通用的 SP,所以我不知道结果表会是什么样子。这意味着我不知道该表将有多少列,以及每列的类型。

此外,在给定的 SP ( @vSpCommand) 内,可能还有另一个对其他存储的动态调用。因此使用OPENROWSET将不起作用。我尝试了以下方法:

SET @vSpCommand = REPLACE(@vSpCommand,'''','''''')

SET @vCmd =  'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TA_SpTable'+@vExecId+']'') AND type in (N''U''))
DROP TABLE TA_SpTable'+@vExecId+' SELECT * INTO TA_SpTable'+ @vExecId+' FROM OPENROWSET(''SQLOLEDB'', ''Server=SERVERNAME,3180;Trusted_Connection=Yes'',
''EXEC '+@vSpCommand+ ''')'

EXEC (@vCmd)

没有任何成功。

问题是如何将这个 SP 的结果插入到表中?

除非不可能,否则在 SQL 中首选解决方案,否则使用 .NET CLR 也是一种选择。

4

2 回答 2

0

在执行此操作之前,您必须在数据库中设置临时权限

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

试试这个,就像你尝试过的一样,但对代码进行了一些更改。你可以很容易地得到它。

DECLARE @vSpCommand NVARCHAR(500),@vCmd NVARCHAR(4000)

SET @vSpCommand = Replace('TestDB.dbo.spg_GetNames', '''', '''''')
SET @vCmd =   'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TA_SpTable]'') AND type in (N''U''))
                    DROP TABLE TA_SpTable' 
            + ' select a.* into TA_SpTable from openrowset(''SQLNCLI'',''Server=.;Trusted_Connection=yes;'',''SET NOCOUNT ON;SET FMTONLY OFF; exec '+ @vSpCommand +''') AS a'

PRINT @vCmd
EXEC (@vCmd) 

select * from TA_SpTable

请注意,我使用了数据库“TestDB”中的 SP“spg_GetNames”。您可以自由地对代码进行任何更改,如果需要任何帮助,请发表评论。

于 2013-12-15T14:47:49.947 回答
0

将您的 SP 转换为一个函数,然后使用 SELECT INTO 语句:

CREATE FUNCTION MyFunction()
RETURNS TABLE
AS
RETURN SELECT 'a' as A, 'b' as B
GO

SELECT *
INTO MyTable
FROM MyFunction()
GO

SELECT * FROM MyTable
GO
于 2013-12-15T13:52:45.500 回答