jon*_*ers 312 sql sql-server stored-procedures sql-server-2005
我有一个返回行的存储过程:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Run Code Online (Sandbox Code Playgroud)
我的实际程序有点复杂,这就是为什么有必要使用sproc的原因.
是否可以通过调用此过程来选择输出?
就像是:
SELECT * FROM (EXEC MyProc) AS TEMP
Run Code Online (Sandbox Code Playgroud)
我需要使用SELECT TOP X,ROW_NUMBER和一个附加WHERE子句来分页我的数据,我真的不想将这些值作为参数传递.
Cha*_*ana 179
您可以
...... sql ....
Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T Where ...
Run Code Online (Sandbox Code Playgroud)
kri*_*tof 156
你应该看看Erland Sommarskog的这篇优秀文章:
它基本上列出了您的方案的所有可用选项.
Meh*_*ari 144
过程可以返回多个结果集,每个结果集都有自己的模式.它不适合在SELECT声明中使用.
CMe*_*rat 73
您要么需要表值函数,要么将EXEC插入临时表:
INSERT INTO #tab EXEC MyProc
Run Code Online (Sandbox Code Playgroud)
Riz*_*taz 41
您必须阅读有关OPENROWSET和OPENQUERY的信息
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
Run Code Online (Sandbox Code Playgroud)
Aam*_*mir 39
您需要声明一个表类型,其中包含与您的存储过程返回的列数相同的列.表类型中的列的数据类型和过程返回的列应该相同
declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)
Run Code Online (Sandbox Code Playgroud)
然后,您需要在刚刚定义的表类型中插入存储过程的结果
Insert into @MyTableType
EXEC [dbo].[MyStoredProcedure]
Run Code Online (Sandbox Code Playgroud)
最后只需从您的表类型中选择
Select * from @MyTableType
Run Code Online (Sandbox Code Playgroud)
Dav*_*eDM 34
没有必要使用临时表.
这是我的解决方案
SELECT * FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
Run Code Online (Sandbox Code Playgroud)
小智 23
您可以将sp的输出复制到temporaty表.
CREATE 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
Run Code Online (Sandbox Code Playgroud)
小智 7
使用OPENQUERY和执行设置'SET FMTONLY OFF; 设置NOCOUNT ON;'
试试这个示例代码:
SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE [database].[dbo].[storedprocedure] value,value ')
Run Code Online (Sandbox Code Playgroud)
小智 6
尝试将您的过程转换为内联函数,该函数返回一个表,如下所示:
CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)
Run Code Online (Sandbox Code Playgroud)
然后你可以称之为
SELECT * FROM MyProc()
Run Code Online (Sandbox Code Playgroud)
您还可以选择将参数传递给函数,如下所示:
CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... )
Run Code Online (Sandbox Code Playgroud)
并称之为
SELECT * FROM FuncName ( @para1 , @para2 )
Run Code Online (Sandbox Code Playgroud)
如果'DATA ACCESS'为假,
EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
Run Code Online (Sandbox Code Playgroud)
后,
SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
Run Code Online (Sandbox Code Playgroud)
有用.
你可以用OPENROWSET作弊:
SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...
Run Code Online (Sandbox Code Playgroud)
当然,每次都会运行整个SP.
| 归档时间: |
|
| 查看次数: |
829232 次 |
| 最近记录: |