1

我使用SQL Server 2005和我有这样的查询:SQL局部变量

INSERT INTO [subject] ([sch_id], 
         [subj_from], 
         [subj_to], 
) 
SELECT 
CASE 
WHEN (SELECT @sched = [sch_id] 
      FROM [schedule] 
      WHERE [sch_name] = 'Searched Schedule Name') IS NULL THEN NULL 
ELSE (SELECT @sched = [sch_id] 
      FROM [schedule] 
      WHERE [sch_name] = 'Searched Schedule Name') 
END 
AS 'sched_search_result', 
    'Sample Value', 
    'Sample Value' 

这工作得很好。它在[subject]表中插入值,通过搜索的CASE语句从[schedule]表中获取第一个值[sch_id]。

我想避免代码冗余,所以我尝试将SELECT语句的结果存储在局部变量中,并使用ISNULL函数对其进行评估。看起来像这样:

DECLARE @sched INT 
INSERT INTO [subject] ([sch_id], 
         [subj_from], 
         [subj_to], 
) 
SELECT 
CASE ISNULL((SELECT @sched = [sch_id] 
      FROM [schedule] 
      WHERE [sch_name] = 'Searched Schedule Name'), 0) 
WHEN 0 THEN NULL 
ELSE @sched 
END 
AS 'sched_search_result', 
    'Sample value', 
    'Sample value' 

但我的代码不起作用。 SQL Server 2005说这个错误来自我使用局部变量(@sched)的那一行。我的查询出了什么问题?

回答

3

我认为这会做你想要什么。

INSERT INTO [subject] ([sch_id], [subj_from], [subj_to]) 
SELECT (
      SELECT [sch_id] 
      FROM [schedule] 
      WHERE [sch_name] = 'Search Schedule Name' 
     ), 
     'from value', 
     'to value' 
+0

插入语句不允许子查询。只有标量表达式是允许的。 - 说SQL Server。 – ELM

+0

@March - 当你有一个'select'语句作为你的数据源时,工作得很好。您在使用'values'时不能使用子查询。 –

+0

哦,我明白了。要尝试一个。 :) – ELM