我想通过单行中的所有值,在必要时处理一些值,然后将结果作为字符串返回。像这样的东西
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
所以,我想以某种方式访问每一行的价值。我可以以某种方式将光标定义在它上面或类似的东西吗?
答案 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