如何在t-sql中迭代单行中的值

时间:2014-07-15 12:07:23

标签: sql sql-server tsql stored-procedures

我想通过单行中的所有值,在必要时处理一些值,然后将结果作为字符串返回。像这样的东西

 create procedure MyProcedure(@varID int)
  as
  begin
      declare @str varchar(max);
      ---here go loop
      foreach value in (select from table where ID=@varID)
         if(condition1)
           --do something
            set @str=@str+@rez;
         if(condition2)
             --
  end

所以,我想以某种方式访问​​每一行的价值。我可以以某种方式将光标定义在它上面或类似的东西吗?

2 个答案:

答案 0 :(得分:1)

您大多只需要稍微转移一下您的想法,并专注于这些信息,驻留在数据库中,作为一个集合,您可以在同一时刻访问特定行的所有列。因此,假设处理逻辑不依赖于列的顺序(就像 foreach 概念的情况一样),而是可以根据依赖于的顺序来考虑规则,你可以很容易地完成这类事情,没有使用CURSOR或任何用户定义函数(UDF)。

例如:

CREATE TABLE #Test
(
    ID INT NOT NULL PRIMARY KEY,
    Col1 VARCHAR(50),
    Col2 VARCHAR(50),
    Col3 DATETIME
);

INSERT INTO #Test VALUES (2, 'test', 'bob', '2014-01-10 13:15:45.123');
INSERT INTO #Test VALUES (5, 'SOMETHING', 'p0t@t0', '2012-10-23 03:23:10.000');
INSERT INTO #Test VALUES (79, 'another', 'bob', '2013-05-05 23:03:33.111');
GO

IF (OBJECT_ID('tempdb..#TestProc') IS NOT NULL)
BEGIN
    DROP PROCEDURE #TestProc;
END;
GO

CREATE PROCEDURE #TestProc
(
    @VarID INT
)
AS
SET NOCOUNT ON;

DECLARE @String VARCHAR(MAX);
SET @String = '';

SELECT 
    @String = @String + CASE
                            WHEN LEN(tmp.Col1) > 6 THEN tmp.Col1 ELSE ''
                        END, -- Condition 1
    @String = @String + CASE
                            WHEN tmp.Col2 = 'bob' THEN
                                '~' + UPPER(tmp.Col2) + '~' ELSE ''
                        END, -- Condition 2

    @String = @String + CASE YEAR(tmp.Col3)
                            WHEN 2012 THEN CONVERT(VARCHAR(50), tmp.Col3, 101)
                            WHEN 2014 THEN '--' +
                                           CONVERT(VARCHAR(50), tmp.Col3, 131)
                            ELSE ''
                        END -- Condition 3
FROM #Test tmp
WHERE tmp.ID = @VarID;

SELECT @String AS [FinalResult];
GO


EXEC #TestProc 2; -- ~BOB~-- 9/03/1435  1:15:45:123PM
EXEC #TestProc 5; -- SOMETHING10/23/2012
EXEC #TestProc 79; -- another~BOB~

答案 1 :(得分:0)

在查询中使用函数并将条件移动到函数,然后像

一样编写查询
SELECT dbo.udf_fun(col1) + dbo.udf_fun(col2) +  dbo.udf_fun(col3) 
from   table 
where  ID=@varID