使用其他表

时间:2016-12-23 06:51:27

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

我有一个带有一个参数的过程,letay @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

谢谢。

1 个答案:

答案 0 :(得分:0)

我并非100%确定我理解您要实现的目标,但如果您希望能够在AssetId中的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 值增加1 - 您的函数可以像这样创建:

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      |
\------------------------/

将为上面的同一数据集提供这些结果(onclick="window.location='index.html'" 只有一行):

"