小编Sch*_*res的帖子

按列进行雪花查询修剪

Snowflake 文档中它说:

\n
    \n
  1. 首先,修剪查询不需要的微分区。
  2. \n
  3. 然后,在剩余的微分区内按列进行修剪。
  4. \n
\n

第二步是什么意思?

\n

让我们以链接中显示的示例表 t1 为例。在此示例表中,我使用以下查询:

\n
SELECT * FROM t1\nWHERE\nDate = \xe2\x80\x9a11/3\xe2\x80\x98 AND\nName = \xe2\x80\x9aC\xe2\x80\x98 \n
Run Code Online (Sandbox Code Playgroud)\n

由于日期 = \xe2\x80\x9a11/3\xe2\x80\x98,它只会扫描微分区 2、3 和 4。由于名称 = \'C\',它可以修剪更多,并且仅扫描微分区-第 2 部分和第 4 部分。

\n

因此最终只会扫描微分区 2 和 4。

\n

但第二步在哪里发挥作用呢?在剩余的微分区中按列修剪意味着什么?

\n

这是否意味着仅扫描微分区 2 上的第 4、5 和 6 行以及微分区 4 上的第 1 行,因为日期是我的聚类键并且已排序,因此您可以使用日期进一步修剪?

\n

那么最终只会扫描4行?

\n

snowflake-cloud-data-platform

5
推荐指数
2
解决办法
525
查看次数

动态 SQL 存储过程和日期时间

我有一个简单的查询,我想将其转换为动态 SQL。我有 2 个输入参数:一个表和一个日期时间。输出是表的行计数和这个特定的日期时间。

CREATE PROCEDURE [etl].[ROWCOUNT_TST2]
    (@P_LOAD_TARGET nvarchar(250),
     @P_LOAD_DATE DATETIME)
AS
BEGIN
    DECLARE @SQL nvarchar(1000)

    SET @SQL = 'SELECT COUNT(*) as Inserted FROM'+@P_LOAD_TARGET +' WHERE VALID_FROM ='''+  @P_LOAD_DATE+''' AND VALID_TO IS NULL'

    EXEC  (@SQL)
END;
GO
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的解决方案。我尝试使用execute进行查询sp_executesql,我在.之前和之后添加了''' @P_LOAD_DATE。我可能在这里遗漏了一些东西。

当我使用表名和日期时间执行存储过程(如 )时2021-05-06 06:41:52.557,出现以下错误:

从字符串转换日期和/或时间时转换失败。

但为什么?

我什至尝试像这样添加到日期时间的转换,但我仍然遇到相同的错误。

 SET @SQL = 'SELECT COUNT(*) as Inserted FROM'+@P_LOAD_TARGET +' WHERE VALID_FROM = convert(datetime,'''+  @P_LOAD_DATE+''') AND VALID_TO IS NULL'
Run Code Online (Sandbox Code Playgroud)

但是当我执行 SELECT Convert(datetime, '2021-05-06 06:41:52.557') 时效果很好。我现在很困惑,找不到问题的根源。

编辑:valid_from是目标表中的日期时间。所以这也不是问题的原因

sql t-sql sql-server dynamic-sql

1
推荐指数
1
解决办法
693
查看次数