Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2000 Forums
 Transact-SQL (2000)
 Create table from variable name

Author  Topic 

Ken Blum
Constraint Violating Yak Guru

383 Posts

Posted - 2003-09-25 : 10:24:21
How can I create a table based on a variable name?

declare @tname varchar(20)

SET @tname = 'Test1'

drop table @tname
create table @tname (x int)

jsmith8858
Dr. Cross Join

7423 Posts

Posted - 2003-09-25 : 10:35:30
Out of curiousity, why are you doing this?

There's a reason SQL Server makes things like this more difficult than you might think they need to be.

- Jeff
Go to Top of Page

JustinBigelow
SQL Gigolo

1157 Posts

Posted - 2003-09-25 : 10:35:56
dynamic SQL. See Books On Line.

Justin

"Look at it out there orbiting like it's so cool, we will rule it with an army of replicants!"
Go to Top of Page

mr_mist
Grunnio

1870 Posts

Posted - 2003-09-25 : 10:45:39
Unless you want a spaghetti system of tables everywhere, just say no to dynamically creating them.

-------
Moo. :)
Go to Top of Page

Ken Blum
Constraint Violating Yak Guru

383 Posts

Posted - 2003-09-25 : 11:01:18
Thanks. Yeah, I know about Dynamic SQL and have already implemented it. The reason behind this is for debugging purposes. I need to take a snapshot of certain tables at certain time periods to determine past problems within an ERP Analytical system (COGNOS). So, I need to see what the table contents were yesterday, the day before, etc. Once I have figured out the problem then this SPROC will no longer be needed.
Go to Top of Page

tkizer
Almighty SQL Goddess

38200 Posts

Posted - 2003-09-25 : 12:22:30
If you know about dynamic sql, then what is your question?

Tara
Go to Top of Page

Ken Blum
Constraint Violating Yak Guru

383 Posts

Posted - 2003-09-26 : 09:29:50
Just wondering if there was a better way. Guess not!
Go to Top of Page

X002548
Not Just a Number

15586 Posts

Posted - 2003-09-26 : 11:08:57
A better way to track what was?

How about History...it's better than a snapshot, because it's always up to date...Current rows stay in the base...just need to UNION HISTORY and BASE for a complete picture...


USE NorthWind
GO

-- 1. CREATE A history table that looks identical to the base table
SELECT * INTO Orders_H FROM Orders WHERE 1=0
GO

-- 2. Add three data administration columns
ALTER TABLE Orders_H Add
HIST_ADD_TS datetime not null DEFAULT GetDate()
, HIST_ADD_TYPE char(1)
, HIST_ADD_BY varchar(25) DEFAULT User
GO

-- 3. Create a trigger to track data changes
CREATE TRIGGER Orders_UpdDelTr ON Orders FOR UPDATE, DELETE AS
If Exists (Select 1 From Inserted) And Exists (Select 1 From Deleted) BEGIN
Insert Into Orders_H (
HIST_ADD_TS
, HIST_ADD_TYPE
, HIST_ADD_BY
, OrderID
, CustomerID
, EmployeeID
, OrderDate
, RequiredDate
, ShippedDate
, ShipVia
, Freight
, ShipName
, ShipAddress
, ShipCity
, ShipRegion
, ShipPostalCode
, ShipCountry
)
SELECT GetDate(), 'U'
, User
, OrderID
, CustomerID
, EmployeeID
, OrderDate
, RequiredDate
, ShippedDate
, ShipVia
, Freight
, ShipName
, ShipAddress
, ShipCity
, ShipRegion
, ShipPostalCode
, ShipCountry
FROM Deleted END
If Not Exists (Select 1 From Inserted) And Exists (Select 1 From Deleted) BEGIN

Insert Into Orders_H (
HIST_ADD_TS
, HIST_ADD_TYPE
, HIST_ADD_BY
, OrderID
, CustomerID
, EmployeeID
, OrderDate
, RequiredDate
, ShippedDate
, ShipVia
, Freight
, ShipName
, ShipAddress
, ShipCity
, ShipRegion
, ShipPostalCode
, ShipCountry
)
SELECT GetDate(), 'D'
, User
, OrderID
, CustomerID
, EmployeeID
, OrderDate
, RequiredDate
, ShippedDate
, ShipVia
, Freight
, ShipName
, ShipAddress
, ShipCity
, ShipRegion
, ShipPostalCode
, ShipCountry
FROM Deleted END
GO



DROP TABLE Orders_H
GO


I've got a "trigger generator" if you're interested...



Brett

8-)

SELECT @@POST FROM Brain ORDER BY NewId()

That's correct! It's an AlphaNumeric!
Go to Top of Page

jsmith8858
Dr. Cross Join

7423 Posts

Posted - 2003-09-26 : 14:50:46
quote:

I've got a "trigger generator" if you're interested...



I think I've used that line before at bars

- Jeff
Go to Top of Page

X002548
Not Just a Number

15586 Posts

Posted - 2003-09-26 : 15:33:38
quote:
Originally posted by jsmith8858

quote:

I've got a "trigger generator" if you're interested...



I think I've used that line before at bars

- Jeff



I hope you got a slap at least for your troubles...



Brett

8-)

SELECT @@POST FROM Brain ORDER BY NewId()

That's correct! It's an AlphaNumeric!
Go to Top of Page

Ken Blum
Constraint Violating Yak Guru

383 Posts

Posted - 2003-09-29 : 10:03:47
That's a great idea. Any ballpark dea of how much of a performance hit we are looking at? Yes, I am interested in your Trigger Generator (without the slap, but rather a pat on the back!)

Thanks.
Go to Top of Page

X002548
Not Just a Number

15586 Posts

Posted - 2003-09-29 : 10:24:44
I've used the same methodology on various platforms, and have stressed the hell out of it

It assumes the following...

1. Connection Pooling with application level logins
2. All Updates require the update by id and datetime (otherwise the trigger will fail)
3. Inserts are not tracked..they are kept in the base
4. Deletes are tracked using stored procedures using the following:


DECLARE @BinVar varbinary(128)
SET @BinVar = CAST( REPLICATE( 0x20, 128 ) AS varbinary(128) )
select @BinVar = convert(varbinary(128),@User_Id)
SET CONTEXT_INFO @BinVar


5. Any updates outside the application will track the login to the server...not the application login
6. The predicates in the code generator will need to change to meet your needs...
7. A mirror history table need to be created for each table
9. Use at your own risk
9. The Jets suck...




SELECT SQL From (
SELECT 'DROP TRIGGER ' + TABLE_NAME + '_UpdDelTr' AS SQL
, TABLE_NAME, 1 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'GO' AS SQL
, TABLE_NAME, 2 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
) as xxx
ORDER BY TABLE_NAME, GROUPORDER,ROWORDER
GO

SELECT SQL From (
SELECT 'CREATE TRIGGER ' + TABLE_NAME + '_UpdDelTr ON ' + TABLE_NAME + ' FOR UPDATE, DELETE AS' AS SQL
, TABLE_NAME, 1 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'If Exists (Select 1 From Inserted) And Exists (Select 1 From Deleted) BEGIN' AS SQL
, TABLE_NAME, 1 AS GROUPORDER, 2 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'Insert Into ' + TABLE_NAME +'_H (' AS SQL
, TABLE_NAME, 1 AS GROUPORDER, 3 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ' HIST_ADD_TS'AS SQL
, TABLE_NAME, 2 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', HIST_ADD_TYPE'AS SQL
, TABLE_NAME, 2 AS GROUPORDER, 2 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', HIST_ADD_BY'AS SQL
, TABLE_NAME, 2 AS GROUPORDER, 3 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', HIST_ADD_SYSUSER_BY' AS SQL
, TABLE_NAME, 2 AS GROUPORDER, 4 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', ' + COLUMN_NAME + ' ' AS SQL
, TABLE_NAME, 3 As GROUPORDER, ORDINAL_POSITION AS ROWORDER
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ')' AS SQL
, TABLE_NAME, 4 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'SELECT GetDate(), '+ '''' + 'U' + '''' AS SQL
, TABLE_NAME, 5 AS GROUPORDER, 0 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ',(Select Inserted.Updated_By From Inserted Where Deleted.' + COLUMN_NAME + ' = Inserted.'
+ COLUMN_NAME AS SQL
, TABLE_NAME, 5 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
AND ORDINAL_POSITION = 1
UNION ALL
SELECT ' And Deleted.' + COLUMN_NAME + ' = Inserted.'
+ COLUMN_NAME AS SQL
, TABLE_NAME, 5 AS GROUPORDER, ORDINAL_POSITION AS ROWORDER
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
AND ORDINAL_POSITION <> 1
UNION ALL
SELECT ' )' AS SQL
, TABLE_NAME, 5 AS GROUPORDER, 9999 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES o
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
AND EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE i
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
AND i.TABLE_NAME = o.TABLE_NAME)
UNION ALL
SELECT ', User' AS SQL
, TABLE_NAME, 5 AS GROUPORDER, 9999 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES o
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE i
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
AND i.TABLE_NAME = o.TABLE_NAME)
UNION ALL
SELECT ', User' AS SQL
, TABLE_NAME, 6 AS GROUPORDER, 0 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', ' + COLUMN_NAME + ' ' AS SQL
, TABLE_NAME, 6 As GROUPORDER, ORDINAL_POSITION AS ROWORDER
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'FROM Deleted END' AS SQL
, TABLE_NAME, 7 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'If Not Exists (Select 1 From Inserted) And Exists (Select 1 From Deleted) BEGIN' AS SQL
, TABLE_NAME, 8 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'Declare @DelBY char(8)' AS SQL
, TABLE_NAME, 9 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'SELECT @DelBY = CASE WHEN ASCII(context_info) <> 0 THEN convert(varchar(8),context_info) ELSE '
+ '''' + 'EXTERNAL' + '''' + ' END' AS SQL
, TABLE_NAME, 10 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'FROM master.dbo.sysprocesses WHERE spid = @@SPID' AS SQL
, TABLE_NAME, 10 AS GROUPORDER, 2 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'Insert Into ' + TABLE_NAME +'_H (' AS SQL
, TABLE_NAME, 11 AS GROUPORDER, 3 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ' HIST_ADD_TS'AS SQL
, TABLE_NAME, 12 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', HIST_ADD_TYPE'AS SQL
, TABLE_NAME, 12 AS GROUPORDER, 2 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', HIST_ADD_BY'AS SQL
, TABLE_NAME, 12 AS GROUPORDER, 3 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', HIST_ADD_SYSUSER_BY' AS SQL
, TABLE_NAME, 12 AS GROUPORDER, 4 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', ' + COLUMN_NAME + ' ' AS SQL
, TABLE_NAME, 13 As GROUPORDER, ORDINAL_POSITION AS ROWORDER
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ')' AS SQL
, TABLE_NAME, 14 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'SELECT GetDate(), '+ '''' + 'D' + '''' AS SQL
, TABLE_NAME, 15 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', @DelBY' AS SQL
, TABLE_NAME, 15 AS GROUPORDER, 2 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', User' AS SQL
, TABLE_NAME, 15 AS GROUPORDER, 2 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT ', ' + COLUMN_NAME + ' ' AS SQL
, TABLE_NAME, 16 As GROUPORDER, ORDINAL_POSITION AS ROWORDER
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'FROM Deleted END' AS SQL
, TABLE_NAME, 17 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
UNION ALL
SELECT 'GO' AS SQL
, TABLE_NAME, 18 AS GROUPORDER, 1 AS ROWORDER
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT LIKE '%_H'
AND (TABLE_NAME LIKE 'ETRS%S%' OR TABLE_NAME LIKE 'XLAT%' OR TABLE_NAME LIKE 'REPORT%')
) as xxx
ORDER BY TABLE_NAME, GROUPORDER,ROWORDER
GO


Brett

8-)

SELECT @@POST FROM Brain ORDER BY NewId()

That's correct! It's an AlphaNumeric!
Go to Top of Page

Ken Blum
Constraint Violating Yak Guru

383 Posts

Posted - 2003-09-29 : 16:58:23
Thanks Brett!
Go to Top of Page
   

- Advertisement -