TSQL Output Tables

Using output tables when inserting multiple rows

If you need to do processing on individual rows when inserting multiple rows into a database table I'd normally use a cursor to achieve what I want.

Instead you can use the OUTPUT instruction to place the details into a temporary table...

DECLARE @TEMP TABLE (NEWID INT, OUTID INT)
INSERT INTO DESTTABLE (VAL1, VAL2, OLDVALUE)
OUTPUT INSERTED.ID, INSERTED.OLDVALUE INTO @TEMP
SELECT VAL1, VAL2, ID
FROM SRCTABLE

This can also be used for UPDATE and DELETE but it's important to remember that on INSERT commands there must be a column for the old value to be inserted

Added 22/05/2026 11:51

TSQL XML Manipulation

How to change XML data via TSQL

Modifying XML data via TQL can be done using the following .modify commands...

To insert a new node/attribute...

UPDATE MyTable SET MyXml.modify('insert <item>new</item> as first into (/root)[1]')
UPDATE MyTable SET MyXml.modify('insert <item>new</item> as last into (/root)[1]')
UPDATE MyTable SET MyXml.modify('insert <item>new</item> after (/root/item[1])[1]')
UPDATE MyTable SET MyXml.modify('insert <item>new</item> before (/root/item[1])[1]')
UPDATE MyTable SET MyXml.modify('insert attribute attr {"new"} into (/root/item[1])[1]')

To change text/attribute in a node...

UPDATE MyTable SET MyXml.modify('replace value of (/root/item[1]/text())[1] with "new"')
UPDATE MyTable SET MyXml.modify('replace value of (/root/item[1]/@attr)[1] with "new"')

To delete a node/attribute/text...

UPDATE MyTable SET MyXml.modify('delete /root/item[1]')
UPDATE MyTable SET MyXml.modify('delete /root/item[1]/@attr')
UPDATE MyTable SET MyXml.modify('delete /root/item[1]/text()')
Added 09/07/2025 09:58

Align SQL Login to User

How to re-align a SQL Login to a Database User

In SQL Server there are two distinct security level when it comes to individual users... one at the server level, the other at the database level.

If a database is restored from a different location, then despite the there being a server login and database user with the exact same name, they are different objects and do not therefore align with each other.

Instead of removing either and re-implementing, simply use the following...

ALTER USER OrphanUser WITH LOGIN = correctedLoginName;
Added 01/10/2024 12:05