小编use*_*949的帖子

未存储标量函数值

我创建了一个标量值函数,它在传入的秒数中暂停。这个函数不会在生产中使用。如果我向查询添加 UDF,我正在尝试测试 SQL Server 如何评估和创建计划。我对它如何评估我的 3 个查询中的最后一个的差异感到非常困惑。首先是创建测试函数的代码:

CREATE FUNCTION dbo.[sleep](@seconds int)
RETURNS datetime
as
BEGIN

DECLARE @sleepUntil datetime
DECLARE @dummy int
SET @sleepUntil = DATEADD(s, @seconds, getdate())
WHILE getdate() < @sleepUntil
    SET @dummy = 0
RETURN getdate()
END
Run Code Online (Sandbox Code Playgroud)

现在创建一个表来测试查询

CREATE TABLE #table (num int)
Run Code Online (Sandbox Code Playgroud)

并插入值

INSERT INTO #table 
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)
Run Code Online (Sandbox Code Playgroud)

第一个查询需要 2 秒才能运行 - 假设 SQL Server 存储从标量函数返回的值,这是有道理的。

   SELECT num
   FROM #table t
   WHERE dbo.sleep(2)=0 
Run Code Online (Sandbox Code Playgroud)

第二个仍然需要 2 秒 - 所以我的假设是它也一样。

 SELECT num
   FROM #table t
   WHERE EXISTS (select TOP 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization functions

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

此时 SQL Server 会验证数据以进行插入

我有一个查询将数据从一个表插入到另一个表中。源列之一大于目标表的列,但查询中选择的实际数据并非如此。因此,例如,源表是varchar(25),目标表是varchar(10),并且查询为该特定列选择不超过 10 个字符的记录。

我的初始查询因截断错误而失败,但是当我重新编写它时,它选择了相同的记录但更改了 where 子句,即WHERE IN在 cte 上使用和过滤它成功运行。

即而不是做

select * from tbl where col1 = 1
Run Code Online (Sandbox Code Playgroud)

我做了:

with cte as (select 1) select * from tbl where col1 in (select 1 from cte)
Run Code Online (Sandbox Code Playgroud)

我知道这是 SQL Server 中的一个错误,但我仍然想知道 SQL Server 在哪一点验证插入的数据。在哪一点抛出错误?

sql-server insert

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

标签 统计

sql-server ×2

functions ×1

insert ×1

optimization ×1