【问题标题】:SQL Local VariableSQL 局部变量
【发布时间】:2011-10-23 20:08:41
【问题描述】:

我使用 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'

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

我想避免代码冗余,因此我尝试将 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) 的行。我的查询有什么问题?

【问题讨论】:

    标签: sql-server-2005 local-variables isnull select-case insert-select


    【解决方案1】:

    我认为这会满足您的要求。

    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'
    

    【讨论】:

    • 插入语句中不允许子查询。只允许标量表达式。 - 说 SQL Server。
    • @March - 当你有一个select 语句作为你的数据源时工作得很好。使用values时不能使用子查询。
    • 哦,我明白了。要试试那个。 :)
    • 当主 SELECT 从不同的表中提取各种值时,子查询可能是最好的方法,但在这种特殊情况下,当只有一个表用作某些值的源时(一个value 实际上)和其他值只是常量,为什么要使用子查询? INSERT … SELECT sch_id, 'from value', 'to value' FROM … 应该做同样的事情,如果我没有遗漏任何东西的话。
    • @Andriy M - 如果没有匹配项,则使用子查询将在列中为您提供空值,如果有多个匹配项,则为异常。在 from 子句中使用表作为源将不会为不匹配添加任何行,并且会为多个匹配添加多行。所以...有区别。
    【解决方案2】:

    这应该可以准确地告诉您您需要什么:http://msdn.microsoft.com/en-us/library/aa259186(v=sql.80).aspx

    【讨论】:

    • 这其实是我第一次使用局部变量。哈哈!谢谢朋友的信息! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多