mpe*_*eim 2 sql-server-2008-r2
我们正在使用 SQL Server 2008 R2,数据库兼容性设置为 SQL Server 2000,我有一个包含几行的表,我正在为多个变量赋值。我希望从使用单独的 SELECT 语句切换到使用单个语句,并且我的代码正在运行,但我不确定它为什么起作用或者它是确定性的。我的特定问题与我在查询中使用 CASE 语句有关,如下面的代码所示。我已经在其中发表了一些评论,所以我希望这个问题有意义......此外,这是我在这里发布的第一篇文章,所以如果我违反了任何理解的协议,请告诉我。
CREATE TABLE [dbo].[FinancialPeriod](
[FinancialPeriodID] [int] IDENTITY(1,1) NOT NULL,
[FinancialPeriod] [varchar](50) NULL,
CONSTRAINT [PK_FinancialPeriod] PRIMARY KEY CLUSTERED
(
[FinancialPeriodID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-- THIS IS A STATIC TABLE CONTAINING THESE RECORDS, IN THIS ORDER
INSERT FinancialPeriod (FinancialPeriod) VALUES('Month To Date')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Quarter To Date')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Year To Date')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Since Inception')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Trailing Month')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Trailing Quarter')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Trailing Year')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Trailing 3 Years')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Trailing 5 Years')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Trailing Year To Last Calendar Quarter')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Last Calendar Month')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Last Calendar Quarter')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Last Calendar Year')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Last Calendar 3 Years')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Last Calendar 5 Years')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Year To Last Calendar Quarter')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Inception To Last Calendar Quarter')
INSERT FinancialPeriod (FinancialPeriod) VALUES('Custom Period')
DECLARE @Period1 VARCHAR(50) = 'Last Qtr'
DECLARE @Period2 VARCHAR(50) = NULL
DECLARE @Period3 VARCHAR(50) = ' '
DECLARE @Period4 VARCHAR(50) = 'Lst Yr'
DECLARE @Period5 VARCHAR(50) = 'Last 3'
DECLARE @Period6 VARCHAR(50)
DECLARE @Period7 VARCHAR(50) = ' '
DECLARE @fp1ID INTEGER = 12
DECLARE @fp2ID INTEGER = 16
DECLARE @fp3ID INTEGER = 10
DECLARE @fp4ID INTEGER = 13
DECLARE @fp5ID INTEGER = 14
DECLARE @fp6ID INTEGER = 17
DECLARE @fp7ID INTEGER = 99
/* PREVIOUS CODE USE
SELECT @Period1 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp1ID
SELECT @Period2 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp2ID
SELECT @Period3 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp3ID
SELECT @Period4 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp4ID
SELECT @Period5 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp5ID
SELECT @Period6 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp6ID
SELECT @Period7 = FinancialPeriod FROM FinancialPeriod WHERE FinancialPeriodID = @fp7ID
*/
SELECT @Period1 = COALESCE(NULLIF(@Period1, ''), CASE WHEN FinancialPeriodID = @fp1ID THEN FinancialPeriod ELSE '' END),
@Period2 = COALESCE(NULLIF(@Period2, ''), CASE WHEN FinancialPeriodID = @fp2ID THEN FinancialPeriod ELSE '' END),
@Period3 = COALESCE(NULLIF(@Period3, ''), CASE WHEN FinancialPeriodID = @fp3ID THEN FinancialPeriod ELSE '' END),
@Period4 = COALESCE(NULLIF(@Period4, ''), CASE WHEN FinancialPeriodID = @fp4ID THEN FinancialPeriod ELSE '' END),
@Period5 = COALESCE(NULLIF(@Period5, ''), CASE WHEN FinancialPeriodID = @fp5ID THEN FinancialPeriod ELSE '' END),
@Period6 = COALESCE(NULLIF(@Period6, ''), CASE WHEN FinancialPeriodID = @fp6ID THEN FinancialPeriod ELSE '' END),
@Period7 = COALESCE(NULLIF(@Period7, ''), CASE WHEN FinancialPeriodID = @fp7ID THEN FinancialPeriod ELSE '' END)
FROM FinancialPeriod
-- COMPARE THESE RESULTS
SELECT @Period1, @Period2, @Period3, @Period4, @Period5, @Period6, @Period7
SELECT @Period1 = CASE WHEN FinancialPeriodID = @fp1ID THEN FinancialPeriod ELSE '' END,
@Period2 = CASE WHEN FinancialPeriodID = @fp2ID THEN FinancialPeriod ELSE '' END,
@Period3 = CASE WHEN FinancialPeriodID = @fp3ID THEN FinancialPeriod ELSE '' END,
@Period4 = CASE WHEN FinancialPeriodID = @fp4ID THEN FinancialPeriod ELSE '' END,
@Period5 = CASE WHEN FinancialPeriodID = @fp5ID THEN FinancialPeriod ELSE '' END,
@Period6 = CASE WHEN FinancialPeriodID = @fp6ID THEN FinancialPeriod ELSE '' END,
@Period7 = CASE WHEN FinancialPeriodID = @fp7ID THEN FinancialPeriod ELSE '' END
FROM FinancialPeriod
-- TO THESE RESULTS... WHY THE DOES THE SECOND ASSIGNMENT RETURN DIFFERENT RESULTS?
SELECT @Period1, @Period2, @Period3, @Period4, @Period5, @Period6, @Period7
Run Code Online (Sandbox Code Playgroud)
我不认为您的代码实际上有效(第一个查询)。例如,当它应该是 时,它的@Period4
值被返回为。发生这种情况是因为您使用变量以及为变量赋值的方式。本应只返回一个排,否则你要分配在表中的所有行的任何值,这是不确定性的。您使用的第二个查询与可以是任何行的列的值进行比较,因此它不匹配并将 a 分配给您的变量。你应该做的是:Lst Yr
Last Calendar Year
COALESCE
SELECT @variable = value from table
@fpID
FinancialPeriodID
''
SELECT @Period1 = MAX(CASE WHEN FinancialPeriodID = @fp1ID THEN FinancialPeriod ELSE '' END),
@Period2 = MAX(CASE WHEN FinancialPeriodID = @fp2ID THEN FinancialPeriod ELSE '' END),
@Period3 = MAX(CASE WHEN FinancialPeriodID = @fp3ID THEN FinancialPeriod ELSE '' END),
@Period4 = MAX(CASE WHEN FinancialPeriodID = @fp4ID THEN FinancialPeriod ELSE '' END),
@Period5 = MAX(CASE WHEN FinancialPeriodID = @fp5ID THEN FinancialPeriod ELSE '' END),
@Period6 = MAX(CASE WHEN FinancialPeriodID = @fp6ID THEN FinancialPeriod ELSE '' END),
@Period7 = MAX(CASE WHEN FinancialPeriodID = @fp7ID THEN FinancialPeriod ELSE '' END)
FROM #FinancialPeriod
Run Code Online (Sandbox Code Playgroud)
或者
SELECT @Period1 = COALESCE(@Period1,MAX(CASE WHEN FinancialPeriodID = @fp1ID THEN FinancialPeriod END),''),
@Period2 = COALESCE(@Period2,MAX(CASE WHEN FinancialPeriodID = @fp2ID THEN FinancialPeriod END),''),
@Period3 = COALESCE(@Period3,MAX(CASE WHEN FinancialPeriodID = @fp3ID THEN FinancialPeriod END),''),
@Period4 = COALESCE(@Period4,MAX(CASE WHEN FinancialPeriodID = @fp4ID THEN FinancialPeriod END),''),
@Period5 = COALESCE(@Period5,MAX(CASE WHEN FinancialPeriodID = @fp5ID THEN FinancialPeriod END),''),
@Period6 = COALESCE(@Period6,MAX(CASE WHEN FinancialPeriodID = @fp6ID THEN FinancialPeriod END),''),
@Period7 = COALESCE(@Period7,MAX(CASE WHEN FinancialPeriodID = @fp7ID THEN FinancialPeriod END),'')
FROM #FinancialPeriod
Run Code Online (Sandbox Code Playgroud)
这样,当在FinancialPeriodID
和之间完成匹配时,您只分配值@fpID
。
归档时间: |
|
查看次数: |
922 次 |
最近记录: |