Skip to content

Instantly share code, notes, and snippets.

@ConstantineK
Last active April 4, 2019 23:33
Show Gist options
  • Save ConstantineK/6225fb6614cb5c11d640c45b037e144d to your computer and use it in GitHub Desktop.
Save ConstantineK/6225fb6614cb5c11d640c45b037e144d to your computer and use it in GitHub Desktop.
Take a SQL Server object (view, table), grab its columns, count distinct its values, and return them in descending order of cardinality
CREATE OR ALTER procedure #data_sampler
(
@schema_name NVARCHAR(128) = 'dbo',
@object_name NVARCHAR(128)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQL NVARCHAR(MAX) =
'
SELECT *
FROM
(
SELECT
/*column_list_with_distinct*/
FROM ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@object_name)+' AS t
) AS summary
UNPIVOT
(
row_count
FOR
table_name IN
(
/*column_list*/
)
) AS unp
ORDER BY
row_count DESC
',
@column_list_with_distinct NVARCHAR(MAX),
@column_list NVARCHAR(MAX),
@magic_value NVARCHAR(73) = '39EACB36-3C89-4E6B-A488-15F8F7E5D363-9CC5643D-8F87-422D-BA48-34A28029CE7B'
SELECT
@column_list_with_distinct =
STRING_AGG
(
CONVERT
(
NVARCHAR(MAX),
CONCAT
(
'COUNT(DISTINCT CASE WHEN ',
QUOTENAME(c.name),
' IS NULL THEN @magic_value ELSE CONVERT(VARCHAR(MAX),',
QUOTENAME(c.name),
') END ) AS ',
QUOTENAME(c.name)
)
),
CONCAT
(
',',
CHAR(10),
CHAR(9),
CHAR(9)
)
),
@column_list =
STRING_AGG(QUOTENAME(c.name), ',')
FROM sys.objects AS so
JOIN sys.schemas AS s ON
s.schema_id = so.schema_id
JOIN sys.columns AS c ON
so.object_id = c.object_id
WHERE
so.name = @object_name
AND s.name = @schema_name
END
SET @SQL = REPLACE(REPLACE(@SQL,'/*column_list_with_distinct*/',@column_list_with_distinct),'/*column_list*/',@column_list)
EXEC sp_executesql @SQL, N'@magic_value NVARCHAR(73)', @magic_value = @magic_value
GO
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment