【问题标题】:Can anyone explain this snippet froma a stored procedure i have picked up谁能从我收集的存储过程中解释这个片段
【发布时间】:2018-12-19 07:33:31
【问题描述】:

这可能是一个愚蠢的问题。我拿起了一个存储过程,但我不太确定这部分在做什么。就在刚开始声明的变量下面。

/* ------------------------------------------------------ */
SELECT @DW_InsDate = DW_InsDate
  FROM [aud].[ExtractTime]
 WHERE [CurrentRecordYN] = 'X';
-- 'X' is the transitory state

有什么想法吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 stored-procedures


    【解决方案1】:

    依次(对于满足条件的每条记录)从DW_InsDate列中赋值给变量值,所以最后在变量@DW_InsDate中找到满足条件的最后一条记录(最后一条记录,即DW_InsDate 列的最后一个值)

    【讨论】:

    • 表中没有“最后一条记录”。
    • 我用这句话来解释,我不知道我怎么称呼它才能理解@GordonLinoff 有什么建议吗?
    • @GordonLinoff 我确定这里的最后一条记录是指最新的记录(假设[aud].[ExtractTime]是一个日期/时间历史表)
    • @ShoaibMaroof 分配的值将从符合条件的未确定行中获取。在使用小表和轻负载机器进行测试时,可能会“出现”使用特定行。这样的假设最终将在现场生产环境中被推翻。如果假设只有一行符合条件,那么最好使用 set 语句(例如,set @DW_InsDate = (select ...);)为什么?当找到多行时,这将产生错误。
    • @SMor 我理解您对 SELECT 的看法,但如果您获得 TOP 1,您可以确保获得一条记录。另外,将函数中的值分配给变量时不会使用 SET 吗?
    【解决方案2】:

    在这里,您尝试在使用“X”过滤CurrentRecordYN 列值后分配ExtractTime 表的DW_InsDate 列的值;

    如果有多个记录,您将不得不面对错误。如果您有多个条目,则需要尝试下面的代码。

    set @DW_InsDate =select top 1 DW_InsDate
      FROM [aud].[ExtractTime]
     WHERE [CurrentRecordYN] = 'X';
    

    【讨论】:

    • 没有错误,检查:DECLARE @t INT CREATE TABLE #tmp (id INT) INSERT INTO #tmp VALUES (1) INSERT INTO #tmp VALUES (2) INSERT INTO #tmp VALUES (3) SELECT @t= id FROM #tmp select @t DROP TABLE #tmp
    • 将具有多行的数据集传递给变量不会产生错误,它只会将每个值(按顺序)分配给变量,这意味着它的最终值将是任何值在最后一行。
    • 它取决于@DW_InsDate 变量,如果它是一个表,那么我们应该向其中插入数据,我假设它不是一个表变量。在我看来,许多新开发人员会因为忘记使用 TOP 获取一条记录而犯错误。
    • 如果 @DW_InsDate 是表变量,则语法 SELECT @DW_InsDate = DW_InsDate FROM... 将失败。 (试一试DECLARE @i table (i int); SELECT @i = i FROM (VALUES(1),(2)) V(i); SELECT * FROM @i;)然后你必须使用INSERT 语句。
    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多