Technical Article

Find Replicated columns of certain data types

,

Script to look at all articles in all publications in a DB to find replicated columns of certain data types.  I used this to find BLOB columns that we wanted to remove from the articles.

-- Script to scan thru all articles in all publications 
-- for certain columns.
CREATE TABLE #tmpArticleColumns
(
	ColumnID int,
	ColumnName sysname,
	PublishedFlag bit
)
GO 

CREATE TABLE #tmpArticlesWithTextTypes
(
	 PublicationDB sysname
	,PublicationName sysname
	,ArticleName sysname
	,TableName sysname
	,ColumnName sysname
	,DataType  sysname
)
GO

SET NOCOUNT ON

DECLARE @lngPKID int
DECLARE @lngMaxPKID int
DECLARE @strPublisherDB sysname
DECLARE @strPublicationName sysname
DECLARE @strArticleName sysname
DECLARE @strSourceObject sysname
DECLARE @strSQL varchar(1024)

SELECT
	 IDENTITY(int) AS PKID
	,DB_NAME() AS PublisherDB
	,p.[name] AS PublicationName
	,a.[name] AS ArticleName
	,OBJECT_NAME(a.objid) AS SourceObject
INTO
	#tmpArticles
FROM
	dbo.syspublications AS p
	INNER JOIN dbo.sysarticles AS a ON
		(p.pubid = a.pubid)
WHERE
	OBJECTPROPERTY(a.objid, 'IsTable') = 1

SELECT @lngMaxPKID = MAX(PKID) FROM #tmpArticles
SET @lngPKID = 0

WHILE @lngPKID <= @lngMaxPKID BEGIN
	-- Get the next set of article info
	SELECT
		 @strPublisherDB = PublisherDB
		,@strPublicationName = PublicationName
		,@strArticleName = ArticleName
		,@strSourceObject = SourceObject
	FROM
		#tmpArticles
	WHERE
		PKID = @lngPKID

	DELETE FROM #tmpArticleColumns

	SET @strSQL = 'INSERT INTO #tmpArticleColumns EXEC [dbo].sp_helparticlecolumns @publication = ''' + @strPublicationName + ''', @article = ''' + @strArticleName + ''''
	PRINT @strSQL
	EXEC(@strSQL)

	IF EXISTS(SELECT 1 FROM #tmpArticleColumns) BEGIN
		-- Now we have a list of the column names in the article 
		-- along with the published flag
		INSERT INTO #tmpArticlesWithTextTypes
		SELECT
			 @strPublisherDB AS PublicationDB
			,@strPublicationName AS PublicationName
			,@strArticleName AS ArticleName
			,so.[name] AS TableName
			,sc.[name] AS ColumnName
			,st.[name] AS DataType 
		FROM
			sysobjects AS so
			INNER JOIN syscolumns AS sc ON
				(so.[id] = sc.[id])
			INNER JOIN #tmpArticleColumns AS ac ON
				(sc.[name] = ac.ColumnName)
			INNER JOIN systypes AS st ON
				(sc.xtype = st.xtype)
		WHERE
			so.[name] = @strSourceObject
			AND ac.PublishedFlag = 1
			AND st.[name] IN('text', 'ntext', 'image') -- Is this all we want to find?
	END

	SET @lngPKID = @lngPKID + 1
END
GO

DROP TABLE #tmpArticles
DROP TABLE #tmpArticleColumns
GO

SELECT * FROM #tmpArticlesWithTextTypes
GO

DROP TABLE #tmpArticlesWithTextTypes
GO

Rate

1 (1)

You rated this post out of 5. Change rating

Share

Share

Rate

1 (1)

You rated this post out of 5. Change rating