Sql server 2005 SQL局部变量

Sql server 2005 SQL局部变量,sql-server-2005,local-variables,isnull,select-case,insert-select,Sql Server 2005,Local Variables,Isnull,Select Case,Insert Select,我使用SQL Server 2005,我有一个如下查询: INSERT INTO [subject] ([sch_id], [subj_from], [subj_to], ) SELECT CASE WHEN (SELECT @sched = [sch_id] FROM [schedule] WHERE [sch_name] = 'Searched Sc

我使用SQL Server 2005,我有一个如下查询:

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'
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'
这个很好用。它在[subject]表中插入值,第一个值[schu id]通过搜索的CASE语句从[schedule]表中获取

我希望避免代码冗余,因此我尝试将SELECT语句的结果存储在局部变量中,并使用ISNULL函数对其求值。看起来像这样:

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'
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)的行。我的查询有什么问题?

这应该准确地告诉您需要什么:

这应该准确地告诉您需要什么:

我想这会满足您的要求

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'

我想这会满足你的要求

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'

insert语句上不允许子查询。只允许使用标量表达式。-表示SQL Server。@March-当您有一个
select
语句作为数据源时,它可以正常工作。使用
值时不能使用子查询。哦,我明白了。我要试试那个当主SELECT从不同的表中提取不同的值时,子查询可能是最好的方法,但在这种特殊情况下,当只有一个表用作某些值(实际上是一个值)的源,而其他值只是常量时,为什么要使用子查询<代码>插入…如果我没有遗漏任何内容,请选择sch_id,'from value','to value'from…
也应该这样做。@Andriy m-如果不存在匹配项,则使用子查询将在列中为您提供空值,如果存在多个匹配项,则为您提供异常。在from子句中使用该表作为源将不会为不匹配添加任何行,为多个匹配添加多个行。所以存在差异。insert语句上不允许子查询。只允许使用标量表达式。-表示SQL Server。@March-当您有一个
select
语句作为数据源时,它可以正常工作。使用
值时不能使用子查询。哦,我明白了。我要试试那个当主SELECT从不同的表中提取不同的值时,子查询可能是最好的方法,但在这种特殊情况下,当只有一个表用作某些值(实际上是一个值)的源,而其他值只是常量时,为什么要使用子查询<代码>插入…如果我没有遗漏任何内容,请选择sch_id,'from value','to value'from…
也应该这样做。@Andriy m-如果不存在匹配项,则使用子查询将在列中为您提供空值,如果存在多个匹配项,则为您提供异常。在from子句中使用该表作为源将不会为不匹配添加任何行,为多个匹配添加多个行。所以有一点不同。这实际上是我第一次使用局部变量。英雄联盟谢谢你的信息,伙计!:)这实际上是我第一次使用局部变量。英雄联盟谢谢你的信息,伙计!:)