在处理动态变量时,如何从SQL查询中“结合”结果?

时间:2018-04-26 03:16:57

标签: sql sql-server tsql

我正在试图弄清楚如何基本循环一些SQL代码。我有一组JobID(只是整数),它们是从像这样的

这样的SQL语句中提取的
wget -O- -q -t1 http://localhost:8080/tester |
  ./tester.pl /doc/path/abc pri=p.txt sec=s.txt

我需要以某种方式将它们设置为变量@jobId并在下面的大型SQL查询中使用此变量(请注意WHERE子句中的查询结尾引用@jobId)。我知道我可以使用游标,但是当我这样做时,生成的结果集是分开的。他们没有“联合”。我需要以某种方式结合结果。这里有什么想法吗?

select jobId from tblJobs_List

1 个答案:

答案 0 :(得分:1)

使用像@Squirrel这样的JOIN(或类似的东西,如IN或EXISTS)是最好的,除非有充分的理由不这样做。

如果需要使用循环,请将作业ID存储在具有IDENTITY列的表变量中。使用IDENTITY列作为循环控制器。创建几个变量。首先创建一个临时表,让循环在循环之后输出之前插入值。

DECLARE @LoopNo INT
     ,@MaxLoopNo INT
     ,@JobID INT

CREATE TABLE #JobIDs (
    LoopNo INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    JobId INT NOT NULL
)
CREATE TABLE #TempTable (
    ...
)

INSERT INTO #JobIDs
    (JobId)
SELECT JobId
FROM tblJobs_List

SET @LoopNo = 1
SET @MaxLoopNo = (SELECT MAX(LoopNo) FROM #JobIDs)

SET @JobID = (SELECT JobId FROM #JobIDs WHERE LoopNo = @LoopNo)

WHILE @LoopNo <= @MaxLoopNo
BEGIN

     INSERT INTO #TempTable
     SELECT [Your query here]

     SET @LoopNo = @LoopNo + 1
     SET @JobID = (SELECT JobId FROM #JobIDs WHERE LoopNo = @LoopNo)

END

SELECT *
FROM #TempTable

再次......如果你可以加入,使用或使用EXISTS,那就更好更高效了。这将在单个运行中构建数据,而不是为第一个数据集中的每个记录构建一次。