2014-10-10 53 views
0

我在我的查询中使用变量时将ROW_NUMBER置于正确的位置时出现问题。Row_number函数和变量

我想通过检查从第一个记录到最后一个记录的每条记录来创建一个查找函数。有些功能我没有正确处理ROW_NUMBER()功能。有小费吗?

/* DECLARATION */ 
... 
/* LOOKUP */ 
SET @MAXID = (SELECT COUNT(ContractNr) FROM SenoOud.dbo.Financieel) 
SET @COUNTER = 1 
WHILE @COUNTER < @MAXID 
    BEGIN 
     SELECT @ROWNUM = ROW_NUMBER() OVER (ORDER BY ContractNr) AS 'CNUM', 
       @IGAS = [Factuur CO/LPG], 
       @IBRAND = [Factuur Brand], 
       @IOVERIG = [Factuur Overig], 
     FROM SenOoud.dbo.Financieel 
     WHERE @ROWNUM = @COUNTER 
/* INSERTION */ 
... 
+0

你可能想看看SQL curso RS。我认为他们会比这更好的解决方案:) – Luaan 2014-10-10 08:41:25

+0

您可能想看看SQL的基于Set的方法,以尽可能避免循环和游标,例如在这里:http://blogs.msdn.com/b /simonince/archive/2009/03/30/procedural-versus-set-based-sql.aspx :) – NickyvV 2014-10-10 09:09:21

+0

为什么你需要这个?对于使用基于集合的方法的更广泛的问题,可能有更好的解决方案 – Serpiton 2014-10-10 10:17:21

回答

1

我觉得这个方法将工作最

SELECT Row_number() 
     OVER (
      ORDER BY ContractNr) AS RNUM, 
     [Factuur CO/LPG], 
     [Factuur Brand], 
     [Factuur Overig] 
INTO #TEMP 
FROM SenOoud.dbo.Financieel 


SET @MAXID = @@ROWCOUNT 
SET @COUNTER = 1 
WHILE @COUNTER < @MAXID 
    BEGIN 
     SELECT top 1 @ROWNUM =RNUM, 
      @IGAS = [Factuur CO/LPG], 
      @IBRAND = [Factuur Brand], 
      @IOVERIG = [Factuur Overig] 
     FROM #TEMP 
     WHERE RNUM = @COUNTER 

     SET @[email protected] + 1 
END 

我加入了顶部1以防万一

+0

同意。像魅力一样,非常感谢你们俩。 编辑:只需要为#TEMP部分创建一个别名 – 2014-10-10 11:55:04

1
SELECT @IGAS = [Factuur CO/LPG], 
     @IBRAND = [Factuur Brand], 
     @IOVERIG = [Factuur Overig] 
FROM (SELECT Row_number() 
       OVER (
        ORDER BY ContractNr) AS ROWNUM, 
       [Factuur CO/LPG], 
       [Factuur Brand], 
       [Factuur Overig] 
     FROM SenOoud.dbo.Financieel) A 
WHERE ROWNUM = @COUNTER 

如果仍然出现错误尝试我有样本数据做同样的事情

CREATE TABLE #temp 
    (
    col1 VARCHAR(50), 
    col2 VARCHAR(50), 
    col3 VARCHAR(50) 
) 

SELECT * 
FROM #temp 

INSERT INTO #temp 
VALUES  ('1','A319','zvxfsdg'), 
      ('2','efg','ddfgdfg'), 
      ('3','xdfg','ddfgxfgdfg') 

SELECT col1, 
     col2, 
     col3 
FROM (SELECT Row_number() 
       OVER (
        ORDER BY col1) AS ROWNUM, 
       col1, 
       col2, 
       col3 
     FROM #temp) A 
WHERE ROWNUM = 1 
+0

是的,我现在也想到了子查询,但它确实给了我一个不正确的语法。 '你'给我一个不正确的语法'A'附近 – 2014-10-10 08:57:49

+0

现在检查以前有一个错误 – 2014-10-10 09:00:29

+0

'A'附近相同的错误语法 – 2014-10-10 09:03:45