【问题标题】:Execute stored procedure with parameter from other table使用其他表中的参数执行存储过程
【发布时间】:2017-05-08 20:54:39
【问题描述】:

我有一个带有一个参数的过程,letsay @AssetID int。

我想从另一个表中选择一个列值,然后将该值用作此过程的参数。

我已经存储了类似这样的过程,并且该表已使用来自 @AssetID 参数的“Where”条件进行过滤:

declare @inspectyear as nvarchar(max), @calc as nvarchar(max), @query as nvarchar(max);

set @inspectyear = STUFF((select distinct ',' + quotename(InspectYear) from ##t2 c
                  for XML path(''), type).value('.','NVARCHAR(MAX)'),1,1,'')

select @calc = ', ' + quotename(Max(InspectYear)) + '  - ' + quotename(Max(InspectYear)-2) 
         + ' as Calc1, ' + quotename(Max(InspectYear)) + ' - ' + quotename(min(InspectYear)) 
         + ' as Calc2' from #t2;

set @query =
';with data as
(
      select      inspectyear,
                  partno, Pos, number
      from #t2
      unpivot
      (
            number
            for Pos in ([Pos1], [Pos2], [Pos3], [Pos4])
      ) unpvt
)
select * ' + @calc + ' into ##temp
from data
pivot
(
      sum(number)
      for inspectyear in (' + @inspectyear + ')
) pvt
order by partno';

exec sp_executesql @query = @query;
select * from ##temp;
drop table ##temp;

所以我需要创建另一个过程,例如:

create procedure spExecmyProc
as
begin
    exec spMyProc '@AssetID' -- <-- The parameter took from other table.
go
end

@date 参数,取自其他表。

有可能做到吗?结果应该只有一个结果。

到目前为止,这就是我所做的。它有效,但结果不是“一个结果”。如果@AssetID 不止一个,它会创建多个结果:

declare @AssetID int;
declare cur CURSOR FOR
select distinct AssetID from myTable

open cur
fetch next from cur into @AssetID
while @@FETCH_STATUS = 0
begin
   exec mySPName @AssetID
   fetch next from cur into @AssetID
end
close cur
DEALLOCATE cur

谢谢。

【问题讨论】:

  • 你能声明一个变量,将该表中的值存储在变量中并将变量作为参数传递给你的SP吗?
  • @shree.pat18,不知道该怎么做。但我会编辑我的问题。

标签: sql stored-procedures sql-server-2008-r2


【解决方案1】:

我不是 100% 确定我理解您想要实现的目标,但如果您希望能够在 mytable 中的每个 AssetID 值上运行一些代码,只返回一个结果对于每个输入值,我认为您可以使用标量值函数。让我们假设您的原始存储过程的目的只是为了简单起见将 AssetId 值增加 1 - 您的函数可以这样创建:

CREATE FUNCTION fnMyFunction (@AssetId INT)
RETURNS INT
AS
BEGIN
    DECLARE @return INT
    SET @return = @AssetId + 1
    RETURN  @return
END

如果你在表中有一些值:

CREATE TABLE Assets (
    AssetId INT
)

INSERT INTO Assets
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 5
UNION
SELECT 7
UNION
SELECT 5

您可以在返回的每个值上调用您的函数:

SELECT  AssetId, 
        dbo.fnMyFunction(AssetId) AS AssetIdPlus1 
FROM Assets

这为我上面定义的超级简单数据集提供了这些结果:

/------------------------\
| AssetId | AssetIdPlus1 |
|---------+--------------|
|    1    |       2      |
|    2    |       3      |
|    3    |       4      |
|    5    |       6      |
|    7    |       8      |
|    5    |       6      |
\------------------------/

如果您只想获取表中每个唯一值 AssetId 的结果,则只需返回 DISTINCT 结果:

SELECT DISTINCT 
    AssetId, 
    dbo.fnMyFunction(AssetId)
FROM Assets

这将为上面的相同数据集提供这些结果(AssetId = 5 只有一行):

/------------------------\
| AssetId | AssetIdPlus1 |
|---------+--------------|
|    1    |       2      |
|    2    |       3      |
|    3    |       4      |
|    5    |       6      |
|    7    |       8      |
\------------------------/

【讨论】:

  • 问题是,我这里的Sp太长了,无法提供。这是数据透视查询的动态结果。所以我需要一个一个地获取“AssetID”然后把它变成一个结果。
  • 无论您当前的存储过程有多长或多复杂,您都应该能够向我们解释其输入和输出的性质,或者解释您遇到的总体问题尝试解决,以便我们可以帮助建议这是否是实现它的最佳方法。
  • @Haminteu - 如果您愿意,我很高兴与您讨论这个问题in chat。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多