我创建了一个标量值函数,它在传入的秒数中暂停。这个函数不会在生产中使用。如果我向查询添加 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) 我有一个查询将数据从一个表插入到另一个表中。源列之一大于目标表的列,但查询中选择的实际数据并非如此。因此,例如,源表是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 在哪一点验证插入的数据。在哪一点抛出错误?