Share via

How to run a create table statement from a variable?

zoe Ohara 286 Reputation points
2021-08-23T11:58:11.727+00:00

Hi,

I have the following statement which runs fine:

CREATE TABLE DL.erp.FMP09DTA_ADS_2( [ADDLIN] CHAR(1) NOT NULL , [ADBUSY] CHAR(3) NOT NULL , 
[TRNSCD] CHAR(6) NOT NULL , [EMPLNO] CHAR(10) NOT NULL , [SHIFT] NUMERIC(1,0) NOT NULL , 
[AUDNOFILL] CHAR(2) NOT NULL , [AUDNO] DECIMAL(9,0) NOT NULL , [AUDSEQ] NUMERIC(4,0) NOT NULL ,
[ABHR] DECIMAL(5,2) NOT NULL , [ABCD] CHAR(3) NOT NULL , [AUCD] CHAR(4) NOT NULL , [RSCD] CHAR(4) NOT NULL , 
[AUIN] CHAR(1) NOT NULL , [PYIN] CHAR(1) NOT NULL , [HLIN] CHAR(1) NOT NULL , [HLTP] CHAR(1) NOT NULL , [INBSIN] CHAR(1) NOT NULL ,
[SCIN] CHAR(1) NOT NULL , [SCTP] CHAR(1) NOT NULL , [TRS1CD] CHAR(4) NOT NULL , [TRS2CD] CHAR(4) NOT NULL , [TRS3CD] CHAR(4) NOT NULL ,
[TRS4CD] CHAR(4) NOT NULL , [ADSHFS] CHAR(1) NOT NULL , [ADSSTM] CHAR(1) NOT NULL , [ADSAMN] DECIMAL(5,0) NOT NULL , [ADSDATE] DATE NOT NULL ,
[CNTRRN] BIGINT NOT NULL , [REPDTE] DATETIME NOT NULL , [LakeGUID] UNIQUEIDENTIFIER NULL ,
CONSTRAINT PK_Notes27 PRIMARY KEY  CLUSTERED (EMPLNO ASC,SHIFT ASC,AUDNO ASC,ADSDATE ASC,CNTRRN ASC))
CREATE NONCLUSTERED INDEX [ix_FMP09DTA_ADS_2_LakeGUID] ON DL.erp.FMP09DTA_ADS_2 (LakeGUID ASC)

But when I run it like this:

declare @s nvarchar(max)
= 'CREATE TABLE DL.erp.FMP09DTA_ADS_2( [ADDLIN] CHAR(1) NOT NULL , [ADBUSY] CHAR(3) NOT NULL , [TRNSCD] CHAR(6) NOT NULL , [EMPLNO] CHAR(10) NOT NULL , [SHIFT] NUMERIC(1,0) NOT NULL , [AUDNOFILL] CHAR(2) NOT NULL , [AUDNO] DECIMAL(9,0) NOT NULL , [AUDSEQ] NUMERIC(4,0) NOT NULL , [ABHR] DECIMAL(5,2) NOT NULL , [ABCD] CHAR(3) NOT NULL , [AUCD] CHAR(4) NOT NULL , [RSCD] CHAR(4) NOT NULL , [AUIN] CHAR(1) NOT NULL , [PYIN] CHAR(1) NOT NULL , [HLIN] CHAR(1) NOT NULL , [HLTP] CHAR(1) NOT NULL , [INBSIN] CHAR(1) NOT NULL , [SCIN] CHAR(1) NOT NULL , [SCTP] CHAR(1) NOT NULL , [TRS1CD] CHAR(4) NOT NULL , [TRS2CD] CHAR(4) NOT NULL , [TRS3CD] CHAR(4) NOT NULL , [TRS4CD] CHAR(4) NOT NULL , [ADSHFS] CHAR(1) NOT NULL , [ADSSTM] CHAR(1) NOT NULL , [ADSAMN] DECIMAL(5,0) NOT NULL , [ADSDATE] DATE NOT NULL , [CNTRRN] BIGINT NOT NULL , [REPDTE] DATETIME NOT NULL , [LakeGUID] UNIQUEIDENTIFIER NULL ,CONSTRAINT PK_Notes2 PRIMARY KEY CLUSTERED (EMPLNO ASC,SHIFT ASC,AUDNO ASC,ADSDATE ASC,CNTRRN ASC)) CREATE NONCLUSTERED INDEX [ix_FMP09DTA_ADS_2_LakeGUID] ON DL.erp.FMP09DTA_ADS_2 (LakeGUID ASC)'

exec @s

I get the error:

The name 'CREATE TABLE DL.erp.FMP09DTA_ADS_2( [ADDLIN] CHAR(1) NOT NULL , [ADBUSY] CHAR(3) NOT NULL , [TRNSCD] CHAR(6) NOT NULL , [EMPLNO] CHAR(10) NOT NULL , [SHIFT] NUMERIC(1,0) NOT NULL , [AUDNOFILL] CHAR(2) NOT NULL , [AUDNO] DECIMAL(9,0) NOT NULL , [AUDSEQ] NUMERIC(4,0) NOT NULL , [ABHR] DECIMAL(5,2) NOT NULL , [ABCD] CHAR(3) NOT NULL , [AUCD] CHAR(4) NOT NULL , [RSCD] CHAR(4) NOT NULL , [AUIN] CHAR(1) NOT NULL , [PYIN] CHAR(1) NOT NULL , [HLIN] CHAR(1) NOT NULL , [HLTP] CHAR(1) NOT NULL , [INBSIN] CHAR(1) NOT NULL , [SCIN] CHAR(1) NOT NULL , [SCTP] CHAR(1) NOT NULL , [TRS1CD] CHAR(4) NOT NULL , [TRS2CD] CHAR(4) NOT NULL , [TRS3CD] CHAR(4) N' is not a valid identifier.

Any ideas what i'm doing wrong?

Thanks

Developer technologies | Transact-SQL
Developer technologies | Transact-SQL

A Microsoft extension to the ANSI SQL language that includes procedural programming, local variables, and various support functions.

0 comments No comments

Answer accepted by question author

Olaf Helper 47,621 Reputation points
2021-08-23T13:35:17.507+00:00

A simple EXEC don't work here, use sp_executesql instead =>

exec sp_executesql @s;

Was this answer helpful?

0 comments No comments

2 additional answers

Sort by: Most helpful
  1. Erland Sommarskog 134.7K Reputation points MVP Volunteer Moderator
    2021-08-23T21:03:39.217+00:00

    What you actually did wrong was to omit the parentheses.

    EXEC @s -- Executes the stored procedure of which the name is in @s.
    EXEC(@s) -- Executes the SQL code in @s.
    

    Was this answer helpful?

    0 comments No comments

  2. zoe Ohara 286 Reputation points
    2021-08-23T13:45:40.647+00:00

    Thanks Olaf! That worked

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.