Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
DB Engine
SQL ServerMSDESQL Server CE
Services
Analysis (Data Mining)Analysis (OLAP)DTSIntegration ServicesNotification ServicesReporting Services
Programming
CLRConnectivitySQLXML
Other Technologies
ClusteringEnglish QueryFull-Text SearchReplicationService Broker
General
Data WarehousingPerformanceSecuritySetupSQL Server ToolsOther SQL Server Topics
DirectoryUser Groups
Related Topics
MS AccessOther DB ProductsMS Server Products.NET DevelopmentVB DevelopmentJava DevelopmentMore Topics ...

SQL Server Forum / General / Other SQL Server Topics / September 2007

Tip: Looking for answers? Try searching our database.

find unique identifier through multiple tables

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
hugues.morel@gmail.com - 22 Sep 2007 10:34 GMT
Hi,

I need to do a report from data in a database that was provided by a
third party where there is no documentation at all. It contains more
than hundred tables and each table has different GUID fields.
In one table there is GUID as a primary key and another GUID as
foreign key. But there is no relation defined to what table this
foreign key refers. I suppose the link between these two tables is
purely managed programatically.

To find out to which table this foreign key is referring I would take
a sample record, write down the value of this foreign key GUID and
then search in all the tables of the database where this value also
appears.

Does anybody have a script or a tool that would allow me to specify a
GUID and it would search through all the tables, detect which fields
are GUIDS, find that value in a GUID field and report all tables and
fieldnames where this value has been found?

Thanks for any help.
Hugues
Dan Guzman - 22 Sep 2007 15:35 GMT
> Does anybody have a script or a tool that would allow me to specify a
> GUID and it would search through all the tables, detect which fields
> are GUIDS, find that value in a GUID field and report all tables and
> fieldnames where this value has been found?

Below is an sample script you can tweak for your needs.

IF OBJECT_ID(N'tempdb..#GuidColumns') IS NOT NULL
   DROP TABLE #GuidColumns

DECLARE
   @GUID uniqueidentifier,
   @TABLE_SCHEMA sysname,
   @TABLE_NAME sysname,
   @COLUMN_NAME sysname,
   @UpdateStatement nvarchar(4000)

-specify uniqueidentifier value to find
SET @GUID = '00000000-0000-0000-0000-000000000000'

SELECT
   TABLE_SCHEMA,
   TABLE_NAME,
   COLUMN_NAME,
   CAST(0 AS bit) AS Found
INTO #GuidColumns
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'uniqueidentifier'

DECLARE GuidColumns CURSOR
   LOCAL FAST_FORWARD FOR
   SELECT
       TABLE_SCHEMA,
       TABLE_NAME,
       COLUMN_NAME
   FROM #GuidColumns
OPEN GuidColumns
WHILE 1 = 1
BEGIN
   FETCH NEXT FROM GuidColumns INTO
       @TABLE_SCHEMA,
       @TABLE_NAME,
       @COLUMN_NAME

    IF @@FETCH_STATUS = -1 BREAK

   SET @UpdateStatement =
       N'UPDATE #GuidColumns SET Found = 1
       WHERE
           TABLE_SCHEMA = @TABLE_SCHEMA
           AND TABLE_NAME = @TABLE_NAME
           AND COLUMN_NAME = @COLUMN_NAME
           AND EXISTS(
               SELECT *
               FROM ' + QUOTENAME(@TABLE_SCHEMA) + '.' +
               QUOTENAME(@TABLE_NAME) +
               N' WHERE ' + QUOTENAME(@COLUMN_NAME) + N' = @Guid)'

   EXEC sp_executesql
       @UpdateStatement,
       N'@TABLE_SCHEMA sysname,
           @TABLE_NAME sysname,
           @COLUMN_NAME sysname,
           @Guid uniqueidentifier',
       @TABLE_SCHEMA = @TABLE_SCHEMA,
       @TABLE_NAME = @TABLE_NAME,
       @COLUMN_NAME = @COLUMN_NAME,
       @Guid = @Guid

END
CLOSE GuidColumns
DEALLOCATE GuidColumns

SELECT
   TABLE_SCHEMA,
   TABLE_NAME,
   COLUMN_NAME,
   Found
FROM #GuidColumns
WHERE
   Found = 1
GO

Signature

Hope this helps.

Dan Guzman
SQL Server MVP

> Hi,
>
[quoted text clipped - 18 lines]
> Thanks for any help.
> Hugues
hugues.morel@gmail.com - 29 Sep 2007 08:13 GMT
Works perfectly!
Thanks a lot Dan !

On 22 sep, 16:35, "Dan Guzman" <guzma...@nospam-online.sbcglobal.net>
wrote:
> > Does anybody have a script or a tool that would allow me to specify a
> > GUID and it would search through all the tables, detect which fields
[quoted text clipped - 113 lines]
>
> - Tekst uit oorspronkelijk bericht weergeven -
--CELKO-- - 22 Sep 2007 22:52 GMT
>> In one table there is GUID as a primary key and another GUID as
foreign key. But there is no relation defined to what table this
foreign key refers [I think you mean that you have no REFERENCES
clause?]. I suppose the link [sic: reference] between these two tables
is purely managed programmatically. <<

I worked for a company that wrote crap like that when I first moved to
Austin. They are still in business, but down from ~1200 employees to
~200 and are now outsourcing their Indian operations to China as they
shrink.

This kind of thing falls apart in about a year.  You get orphans all
over the schema (we choked a hard disk for a relatively small custom
sales commission package).  There is no ways to validate or verify a
GUID; you need a proper key instead of a bad attempt at pointer
chains.  The "pseudo Foreign Key" will be referenced by Cabbages and
Kings simply because all GUIDs can be compared (like pointers or other
exposed physical locators).

You really need to throw this thing out.  But if you cannot, then
update your resume.
Ed Murphy - 24 Sep 2007 16:33 GMT
>>> In one table there is GUID as a primary key and another GUID as
> foreign key. But there is no relation defined to what table this
[quoted text clipped - 14 lines]
> Kings simply because all GUIDs can be compared (like pointers or other
> exposed physical locators).

He can add REFERENCES clauses (once he figures out which ones should
be added, and cleans up any existing exceptions), surely?
--CELKO-- - 26 Sep 2007 22:30 GMT
>> He can add REFERENCES clauses (once he figures out which ones should be added, and cleans up any existing exceptions), surely? <<

Then he will have mimicked a 1970's pointer chain DB in SQL instead of
making this a properly designed RDBMS.

For example, if I use an VIN for an automobile, I can verify the VIN
by going to the automobile, the DMV, insurance company, etc.  But if I
use a GUID (or any other hardware generated value), I have no trusted
external source for verification.

I do not have a good way to validate it, in fact.  The magical
universal GUID might be used for an automobile, a squid or Britney
Spears!
Ed Murphy - 27 Sep 2007 03:29 GMT
>>> He can add REFERENCES clauses (once he figures out which ones should be added, and cleans up any existing exceptions), surely? <<
>
[quoted text clipped - 9 lines]
> universal GUID might be used for an automobile, a squid or Britney
> Spears!

Other than size, is this significantly different from any other type
of artificial record key, e.g. INT IDENTITY?
--CELKO-- - 27 Sep 2007 14:41 GMT
>> Other than size, is this significantly different from any other type of artificial record key, e.g. INT IDENTITY?  <<

GUIDs are globally unique (we hope!) and IDENTITY is local to one
table in one schema on one machine.  But neither of them is an
attribute of an  entity in a data model, neither has validation and
verification, etc.

And I am glad that you called a **record key** since so many newbies
don't understand physical records versus logical rows.  If you grew up
with a sequential file system, it is hard to lose that mindset.
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.