Pinned Tweet
New article: How to Survive a Rollback (when logging)

How to ensure log messages are always written to the database, even when a containing transaction rolls back.

sql.kiwi/2025/04/surviv…
1
5
15
1,138
RIP Sam Neill.

Great actor, great winemaker, great New Zealander.

Difficult not to take these things unreasonably personally.
0
1
4
691
I don't really understand why anyone is excited about nested CTEs, but if you want to try it on SQL 2025 CTP2 box, enable TF 15320 (session or global).

Currently only documented for 'Fabric' whatever that is docs.microsoft.com/en-us/sql/t-sq…
1
2
12
1,029
Looks like 'expression indexes' are coming to SQL Server 2025.

This is valid syntax on CTP 2 when trace flag 17152 is enabled:

CREATE INDEX ix ON MyTable (n * 2);

It creates a computed column for you, named e.g. $expression_index_B18729F8A924473FA0DF2CB95D9B2E01.
3
4
18
976
Interesting undocumented USE HINTs in SQL Server 2025 CTP 2:

* DISABLE_PERFORMANCE_SORT_FOR_DML
sets DMLRequestSort to false like TF 8795
* DISABLE_OPTIONAL_PARAMETER_OPTIMIZATION
* PARALLEL_DML_FOR_VECTOR_INDEX_BUILD
* DISABLE_SCALABLE_SUBTREE
0
3
7
588
Paul White retweeted
TRUNCATE TABLE WITH PARTITIONS causes data corruption with non-aligned partitions
feedback.azure.com/d365community/…
1
1
7
547
This is a really funny SQL Server bug

dbfiddle.uk/iUmhLPln

DECLARE @T table (i smallint NOT NULL PRIMARY KEY);

INSERT @T (i)
VALUES (256);

SELECT TRY_CONVERT(tinyint, T.i)
FROM @T AS T;

SET STATISTICS XML ON;

-- Oops!
SELECT T.i
FROM @T AS T
WHERE TRY_CONVERT(tinyint, T.i) IS NULL;
1
4
12
771
New article: Recording Debugging Information Inside a SQL Server Function Call

We cannot use PRINT or RAISERROR statements within a T-SQL function body for debugging purposes. This article presents a workaround using session context.

sql.kiwi/2025/04/debug-…
1
4
15
826
FYI my rates for US residents have increased by 25% from today
1
0
12
543
New article: Accessing a SQL Server Table Variable in a Different Scope

Two ways to access a SQL Server table variable outside its declaration scope.

sql.kiwi/2025/04/access…
0
4
13
720
Since 2008, XACT_STATE includes system transactions, so it works correctly in triggers.

But:

-- XACT_STATE = 0
PRINT 'XACT_STATE = ' + CONVERT(varchar(11), XACT_STATE());
-- XACT_STATE = 1
PRINT CONCAT('XACT_STATE = ', XACT_STATE());

😲
0
1
7
354
You can't use PRINT or RAISERROR in a SQL Server function to emit debugging data.

A workaround:

Call sp_set_session_context to save info inside the function. Read the data using SESSION_CONTEXT after the function call.
5
5
35
1,343
New article: Avoid optional_spid Plan Cache Issues when Sharing Temp Tables

How to avoid unnecessary stored procedure compilation and plan cache pollution when using shared SQL Server temporary tables.

sql.kiwi/2025/03/avoid-…
0
5
14
833
New article: Sharing Data Between Procedures using a Cursor

Contrary to the product documentation, SQL Server cursor variables can be used to share data between stored procedures in the input or output direction (but not both).

sql.kiwi/2025/03/sharin…
0
1
9
553
Paul White retweeted
Replying to @SQL_Kiwi
Follow-up article showing how to use this technique with updates:

Updating in Batches using an API Cursor

sql.kiwi/2025/03/batch-…
0
3
6
340
New SQL Server article: Deleting in Batches using an API Cursor

API cursors are quite different from T-SQL cursors. They can operate on more than one row at a time, which makes them particularly suited to batched operations, even on an unindexed heap.

sql.kiwi/2025/03/batch-…
2
7
26
1,306
Replying to @SQL_Kiwi
Follow-up article showing how to use this technique with updates:

Updating in Batches using an API Cursor

sql.kiwi/2025/03/batch-…
0
3
6
340