【发布时间】:2016-11-23 21:20:26
【问题描述】:
我有这个存储过程:
ALTER procedure [dbo].[sp_checker2]
(@Item varchar(70), @location varchar(8))
as
declare @Query varchar(2000)
set @location = 'XXX909'
declare @Table Table (Qty int)
set @Query = 'select TOP 1 * from openquery(xxxx,''SELECT NVL(b.t$st,0) from server.XXXXXID0001 a left join
server.XXXXXID0002 b on a.t$item = b.t$item where b.t$cloc = '''''+ @location + ''''' and trim(a.t$item)='''''+ @Item + ''''''')'
insert into @Table exec (@Query)
if not exists (select * from @Table )
begin
set @Query = 'select TOP 1 * from openquery(xxxx,''SELECT NVL(b.t$st,0) from server.XXXXXID0001 a
left join server.XXXXXID0002 b on a.t$item = b.t$item where trim(a.t$item) = '''''+ @Item + ''''''' )'
insert into @Table exec (@Query)
end
select * from @Table
问题是我正在寻找这样的查询SELECT:
SELECT
column1, column2, column3, column4,
(EXEC [dbo].[sp_checker2] 'param1=value of column3', 'param2=another value') AS column5
FROM
table
WHERE
column1 = 'data1'
AND column2 = 'data2'
ORDER BY
column3
我知道在 SQL Server 的 SELECT 语句中执行存储过程是不可能的,我的替代方法是将存储过程转换为函数,但在存储过程内部我有一个 exec 到将数据插入表变量。有没有办法可以将此存储过程转换为函数?
附:我只在变量表中保存一行,即:如果项目存在,则保存其库存:“6500”
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
谢谢@marc_s,我会在接下来的手术中考虑这个重要的事实。
-
您的查询中有前 1 个,但它们没有排序依据。这意味着无法确定将返回哪一行。
标签: sql-server function stored-procedures sql-server-2012 user-defined-functions