Skip to content

Instantly share code, notes, and snippets.

View dhmacher's full-sized avatar

Daniel Hutmacher dhmacher

View GitHub Profile
@dhmacher
dhmacher / update-statistics.sql
Last active September 22, 2023 09:57
Use UPDATE STATISTICS to fake table & index sizes
DECLARE @object_id int=OBJECT_ID('dbo.tablename'),
@rowcount bigint=10000000;
SELECT N'UPDATE STATISTICS '+
--- Name of the table
QUOTENAME(OBJECT_SCHEMA_NAME(@object_id))+N'.'+QUOTENAME(OBJECT_NAME(@object_id))+
@dhmacher
dhmacher / move-deprecated-objects.sql
Last active July 26, 2022 21:43
Move temp/backup objects to Deprecated schema
IF (SCHEMA_ID('Deprecated') IS NULL)
EXEC('CREATE SCHEMA [Deprecated];');
SELECT 'ALTER SCHEMA [Deprecated] TRANSFER '+QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))+'.'+QUOTENAME(OBJECT_NAME([object_id]))+';'
FROM sys.objects
WHERE [schema_id] NOT IN (SCHEMA_ID('Deprecated'), SCHEMA_ID('sys'))
AND [type] NOT IN ('PK', 'F', 'D', 'UQ')
AND ([name] LIKE '%xx%' OR [name] LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9]%'
OR [name] LIKE '%[ _]temp' OR [name] LIKE 'temp[ _]%'
OR [name] LIKE '%[ _]old' OR [name] LIKE 'old[ _]%'
-- TRANSLATE() and STRING_SPLIT() work with SQL Server 2016+, STRING_AGG() with 2017+.
-- language_id=1033 is English (simplified)
SELECT STRING_AGG(REPLACE(TRANSLATE(s.[value] COLLATE database_default, '():.,-/='';', '**********'), '*', ''), ' ')
FROM sys.messages AS msg
CROSS APPLY STRING_SPLIT(msg.[text], ' ') AS s
WHERE msg.language_id=1033
--AND s.[value] COLLATE database_default NOT IN ('the', 'is', 'to', 'not', 'a', 'for', 'in', 'be', 'of', 'or', 'cannot', 'and')
AND s.[value] COLLATE database_default NOT LIKE '%[%@=]%'
GROUP BY msg.message_id
@dhmacher
dhmacher / script_table_as_insert.sql
Created June 11, 2019 12:42
Script table contents as INSERT statements
DECLARE @object_id int=OBJECT_ID('schema_name.table_name');
DECLARE @name nvarchar(max)=(SELECT QUOTENAME(SCHEMA_NAME([schema_id]))+'.'+QUOTENAME([name]) FROM sys.objects WHERE [object_id]=@object_id),
@cols nvarchar(max)=N'',
@query nvarchar(max)=N'',
@pagesize varchar(10)=N'100';
WITH cte AS (
SELECT c.column_id, c.[name], t.[name] AS [type]
@dhmacher
dhmacher / list_tables_and_indexes.sql
Last active July 26, 2022 21:43
List tables and indexes, with partitioning, compression, storage, etc.
SELECT o.[type],
ISNULL(NULLIF(t.temporal_type_desc, 'NON_TEMPORAL_TABLE'), o.[type_desc]) AS object_type,
s.[name]+'.'+o.[name] AS [object_name],
(CASE WHEN i.is_unique=1 THEN 'UNIQUE ' ELSE '' END)+i.[type_desc] AS index_type,
(CASE WHEN kc.is_system_named=1 THEN '' ELSE i.[name] END) AS index_name,
ISNULL('WHERE '+i.filter_definition, '') AS index_filter,
ISNULL(' ON '+(CASE WHEN ds.is_default=0 THEN ds.[name] END)+ISNULL('('+c.[name]+')', ''), '') AS data_space,
ISNULL(CAST(NULLIF(NULLIF(i.fill_factor, 0), 100) AS varchar(10))+'%', '') AS fill_factor,
ISNULL(CAST(p.partition_number AS varchar(10))+'/'+CAST(NULLIF(MAX(p.partition_number) OVER (PARTITION BY p.[object_id], p.index_id), 1) AS varchar(10)), '') AS [partition],
ISNULL(NULLIF(p.data_compression_desc, 'NONE'), '') AS [compression],