sql >> Databasteknik >  >> RDS >> Sqlserver

Hur använder man en variabel för databasnamnet i T-SQL?

Lägg hela skriptet i en mallsträng med platshållare för {SERVERNAME}. Redigera sedan strängen med:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

och kör det sedan med

EXECUTE (@SQL_SCRIPT)

Det är svårt att tro att ingen under loppet av tre år märkte att min kod inte fungerar !

Du kan inte EXEC flera partier. GO är en batchseparator, inte en T-SQL-sats. Det är nödvändigt att bygga tre separata strängar och sedan till EXEC var och en efter byte.

Jag antar att man skulle kunna göra något "smart" genom att dela upp den enda mallsträngen i flera rader genom att dela på GO; Jag har gjort det i ADO.NET-kod.

Och var fick jag ordet "SERVERNAMN" ifrån?

Här är lite kod som jag just testade (och som fungerar):

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'

DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'

DECLARE @SQL_SCRIPT VARCHAR(MAX)

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)


  1. Hur skriver man en skiftlägesokänslig fråga för både MySQL och Postgres?

  2. Hur stor inverkan kan ett val av datatyp ha?

  3. MySQL Aggregate-funktioner utan GROUP BY-sats

  4. Tidszonnamn med identiska egenskaper ger olika resultat när de tillämpas på tidsstämpel