SET NOCOUNT ON
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DataQualityUnitTest]')
AND type in (N'U'))
DROP TABLE [dbo].[DataQualityUnitTest]
GO
CREATE TABLE [dbo].[DataQualityUnitTest]
(
[testType] [varchar](10) NOT NULL,
[rules] [xml] NOT
NULL,
CONSTRAINT
[PK_DataQualityUnitTest] PRIMARY KEY CLUSTERED ( [testType] ASC )
)
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GenerateColumnDefaultDataQualityRules]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[GenerateColumnDefaultDataQualityRules]
GO
CREATE PROCEDURE [dbo].[GenerateColumnDefaultDataQualityRules]
AS
BEGIN
SET NOCOUNT ON
DECLARE @x
xml
SET @x =
(
SELECT
Tag
,
Parent
,
null AS
[Defaults!1]
,
[table] AS [Default!2!table]
,
[column] AS [Default!2!column]
,
[value] AS [Default!2!value]
FROM
( SELECT
1 AS
Tag,
0 AS
Parent,
null AS [table],
null AS
[column],
null AS
[value]
UNION
ALL
select
2 AS Tag,
1 AS Parent,
i.TABLE_NAME AS
[table],
i.COLUMN_NAME AS
[column],
i.COLUMN_DEFAULT AS
[value]
FROM
information_schema.columns
i
WHERE
NOT i.COLUMN_DEFAULT IS NULL
)x
FOR XML EXPLICIT
)
SELECT @x
END
GO
IF NOT OBJECT_ID('tempdb..#t') IS NULL
DROP TABLE #t;
GO
CREATE TABLE #t ( result xml )
INSERT INTO #t EXEC
GenerateColumnDefaultDataQualityRules
INSERT INTO [DataQualityUnitTest] SELECT
'Defaults',
result FROM #t
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ExecLiteral]')
AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[ExecLiteral]
GO
CREATE PROCEDURE [dbo].[ExecLiteral]
@literal nvarchar(max)
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #results (
resultText nvarchar(MAX) null )
CREATE TABLE #literal (
literalText nvarchar(max) not null )
INSERT INTO #literal EXEC sp_executesql @literal
DECLARE
@sqlText nvarchar(max)
DECLARE
cur CURSOR FORWARD_ONLY KEYSET FOR
SELECT
[literalText] FROM #literal
OPEN cur
FETCH NEXT
FROM cur INTO
@sqlText
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT
INTO #results EXEC
sp_executesql @sqlText
FETCH
NEXT FROM cur INTO
@sqlText
END
CLOSE cur
DEALLOCATE
cur
SELECT * FROM #results
DROP TABLE #literal
DROP TABLE #results
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestDefaultsAndValueExistance]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[TestDefaultsAndValueExistance]
GO
CREATE PROCEDURE [dbo].[TestDefaultsAndValueExistance]
AS
BEGIN
DECLARE
@unitTest xml
SELECT
@unitTest = rules FROM
DataQualityUnitTest WHERE testType = 'Defaults'
SELECT
Rules.c.value('@table','sysname') AS table_name
,
Rules.c.value('@column','sysname') AS column_name
,
Rules.c.value('@value','sysname') AS column_default
FROM
@unitTest.nodes('/Defaults/Default')
Rules(c)
EXCEPT
SELECT
table_name, column_name,
column_default
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
NOT COLUMN_DEFAULT IS
NULL
EXEC
ExecLiteral 'DECLARE @unitTest xml;
SELECT @unitTest = rules FROM
DataQualityUnitTest WHERE testType = ''Defaults'';
SELECT ''IF EXISTS ( SELECT * FROM '' +
Rules.c.value(''@table'',''sysname'') + ''
WHERE '' + Rules.c.value(''@column'',''sysname'') + ''
IS NULL ) SELECT ''''''+
Rules.c.value(''@table'',''sysname'') +''.''+ Rules.c.value(''@column'',''sysname'') + ''
contains NULL values''''''
FROM
@unitTest.nodes(''/Defaults/Default'') Rules(c);'
END
GO
EXEC [dbo].[TestDefaultsAndValueExistance]