我有一个返回行的存储过程:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
我的实际过程有点复杂,这就是为什么需要一个存储过程的原因。
是否可以通过调用此过程来选择输出?
例如:
SELECT * FROM (EXEC MyProc) AS TEMP
我需要使用 SELECT TOP X
、ROW_NUMBER
和额外的 WHERE
子句来对我的数据进行分页,而且我不想将这些值作为参数传递。
我有一个返回行的存储过程:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
我的实际过程有点复杂,这就是为什么需要一个存储过程的原因。
是否可以通过调用此过程来选择输出?
例如:
SELECT * FROM (EXEC MyProc) AS TEMP
我需要使用 SELECT TOP X
、ROW_NUMBER
和额外的 WHERE
子句来对我的数据进行分页,而且我不想将这些值作为参数传递。
您可以执行以下步骤来处理存储过程的结果集:
... SQL代码...
Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T Where ...
INSERT #T
或 INSERT @T
的问题在于无法嵌套使用 INSERT EXEC
语句。
如果存储过程中已经有了一个 INSERT EXEC
,那么这样将行不通。 - MOHCTP存储过程可以返回多个具有自己模式的结果集,不适合在SELECT
语句中使用。
您可能想要一个表值函数,或者将EXEC语句插入到临时表中:
INSERT INTO #tab EXEC MyProc
INSERT #T
或INSERT @T
的问题在于无法嵌套INSERT EXEC
语句。
如果存储过程中已经有一个INSERT EXEC
,那么这样做将行不通。 - MOHCTP你需要声明一个表类型,其中包含与存储过程返回的列数量相同的列。 表类型中的列的数据类型和存储过程返回的列应该是相同的。
declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)
那么您需要将存储过程的结果插入到您刚定义的表类型中
Insert into @MyTableType
EXEC [dbo].[MyStoredProcedure]
最终只需从您的表类型中进行选择
Select * from @MyTableType
你必须了解 OPENROWSET 和 OPENQUERY。
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
不必使用临时表。
这是我的解决方案。
SELECT * FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
- alexkovelskyEXEC sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
确实使错误消失了。但是现在当我执行 SELECT * FROM OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
时,我得到一个语法错误 - 即使像这里 D节 中提到的通过查询 SELECT * FROM OPENQUERY (Server, 'SELECT name FROM dbo.Customers');
也给我一个语法错误。还有什么其他的缺失吗? - MattCREATE TABLE #GetVersionValues
(
[Index] int,
[Name] sysname,
Internal_value int,
Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues
CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)
然后你可以称其为:
SELECT * FROM MyProc()
您还可以选择按以下方式向函数传递参数:
CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... )
并将其称为
SELECT * FROM FuncName ( @para1 , @para2 )
EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
之后,
SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
它有效。
SET FMTONLY OFF; SET NOCOUNT ON;
尝试使用以下示例代码:
SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE [database].[dbo].[storedprocedure] value,value ')
如果您遇到“服务器未配置数据访问”错误,请使用以下方法:
EXEC sp_serveroption 'YourServer', 'DATA ACCESS', TRUE
Ctrl+T
以文本形式输出结果,然后复制第一列行并从中删除额外的空格,您就可以轻松获得列名。要返回网格输出,请按Ctrl+D
。 - AshrafulINSERT
EXEC
[如果 你的存储过程不是太复杂],3. 作弊并使用OPENQUERY
。但是每个答案都被重复许多次,其中许多答案得到了惊人的赞数。你已经被警告了。 - ruffin