Domanda

C'è un modo per fare un TSQL variabile costante?

È stato utile?

Soluzione

No, ma è possibile creare una funzione e codificare in là e utilizzare.

Ecco un esempio:

CREATE FUNCTION fnConstant()
RETURNS INT
AS
BEGIN
    RETURN 2
END
GO

SELECT dbo.fnConstant()

Altri suggerimenti

La mia soluzione al mancanti constans è quello di fornire indicazioni circa il valore per l'ottimizzatore.

DECLARE @Constant INT = 123;

SELECT * 
FROM [some_relation] 
WHERE [some_attribute] = @Constant
OPTION( OPTIMIZE FOR (@Constant = 123))

Questo dice la query compilatore per trattare la variabile come se fosse una costante durante la creazione del piano di esecuzione.Il lato negativo è che è necessario definire il valore di due volte.

Utilizzare pseudo-costanti: http://blogs.msdn.com/b/sql_server_appendix_z/archive/2013/09/16/sql-server-variables-parameters-or-literals-or-constants.aspx

Pseudo-le Costanti non sono variabili o parametri.Invece, sono semplicemente punti di vista con una riga e un numero sufficiente di colonne per sostenere il vostro costanti.Con queste semplici regole, il Motore SQL ignora completamente il valore di visualizzazione, ma crea comunque un piano di esecuzione basato sulla sua valore.Il piano di esecuzione che non compare un join per la vista!

No, ma il buon vecchio convenzioni di denominazione deve essere utilizzato.

declare @MY_VALUE as int

Non c'è il supporto integrato per le costanti in T-SQL.Si potrebbe utilizzare SQLMenace approccio di simulare (anche se non si può mai essere sicuri se qualcun altro ha sovrascritto la restituzione della funzione di qualcos'altro...), o, eventualmente, di scrivere una tabella contenente costanti, come suggerito qui.Forse scrivere un trigger che annulla le eventuali modifiche al ConstantValue colonna?

Prima di utilizzare una funzione SQL eseguire lo script seguente per vedere le differenze in termini di prestazioni:

IF OBJECT_ID('fnFalse') IS NOT NULL
DROP FUNCTION fnFalse
GO

IF OBJECT_ID('fnTrue') IS NOT NULL
DROP FUNCTION fnTrue
GO

CREATE FUNCTION fnTrue() RETURNS INT WITH SCHEMABINDING
AS
BEGIN
RETURN 1
END
GO

CREATE FUNCTION fnFalse() RETURNS INT WITH SCHEMABINDING
AS
BEGIN
RETURN ~ dbo.fnTrue()
END
GO

DECLARE @TimeStart DATETIME = GETDATE()
DECLARE @Count INT = 100000
WHILE @Count > 0 BEGIN
SET @Count -= 1

DECLARE @Value BIT
SELECT @Value = dbo.fnTrue()
IF @Value = 1
    SELECT @Value = dbo.fnFalse()
END
DECLARE @TimeEnd DATETIME = GETDATE()
PRINT CAST(DATEDIFF(ms, @TimeStart, @TimeEnd) AS VARCHAR) + ' elapsed, using function'
GO

DECLARE @TimeStart DATETIME = GETDATE()
DECLARE @Count INT = 100000
DECLARE @FALSE AS BIT = 0
DECLARE @TRUE AS BIT = ~ @FALSE

WHILE @Count > 0 BEGIN
SET @Count -= 1

DECLARE @Value BIT
SELECT @Value = @TRUE
IF @Value = 1
    SELECT @Value = @FALSE
END
DECLARE @TimeEnd DATETIME = GETDATE()
PRINT CAST(DATEDIFF(ms, @TimeStart, @TimeEnd) AS VARCHAR) + ' elapsed, using local variable'
GO

DECLARE @TimeStart DATETIME = GETDATE()
DECLARE @Count INT = 100000

WHILE @Count > 0 BEGIN
SET @Count -= 1

DECLARE @Value BIT
SELECT @Value = 1
IF @Value = 1
    SELECT @Value = 0
END
DECLARE @TimeEnd DATETIME = GETDATE()
PRINT CAST(DATEDIFF(ms, @TimeStart, @TimeEnd) AS VARCHAR) + ' elapsed, using hard coded values'
GO

Se siete interessati a ottenere il piano di esecuzione ottimale per un valore alla variabile, è possibile utilizzare una dinamica di codice sql.Rende la variabile costante.

DECLARE @var varchar(100) = 'some text'
DECLARE @sql varchar(MAX)
SET @sql = 'SELECT * FROM table WHERE col = '''+@var+''''
EXEC (@sql)

Per le enumerazioni o semplice costanti, una vista con una singola riga ha grandi prestazioni e di compilazione di controllo e di rilevamento delle dipendenze ( causa sua un nome di colonna )

Vedere Jared Ko il post del blog di https://blogs.msdn.microsoft.com/sql_server_appendix_z/2013/09/16/sql-server-variables-parameters-or-literals-or-constants/

creare la vista

 CREATE VIEW ShipMethods AS
 SELECT CAST(1 AS INT) AS [XRQ - TRUCK GROUND]
   ,CAST(2 AS INT) AS [ZY - EXPRESS]
   ,CAST(3 AS INT) AS [OVERSEAS - DELUXE]
  , CAST(4 AS INT) AS [OVERNIGHT J-FAST]
   ,CAST(5 AS INT) AS [CARGO TRANSPORT 5]

utilizzare la visualizzazione

SELECT h.*
FROM Sales.SalesOrderHeader 
WHERE ShipMethodID = ( select [OVERNIGHT J-FAST] from ShipMethods  )

Va bene, consente di vedere

Costanti sono valori immutabili che sono noti in fase di compilazione e non cambiare per la durata del programma

il che significa che non si può mai avere una costante in SQL Server

declare @myvalue as int
set @myvalue = 5
set @myvalue = 10--oops we just changed it

il valore appena cambiato

Poiché non vi è nessuna build di supporto per le costanti, la mia soluzione è molto semplice.

Dal momento che questo non è supportato:

Declare Constant @supplement int = 240
SELECT price + @supplement
FROM   what_does_it_cost

Vorrei semplicemente convertire

SELECT price + 240/*CONSTANT:supplement*/
FROM   what_does_it_cost

Ovviamente, questo si basa su tutta la faccenda (il valore senza spazio finale e commento) di essere unici.Cambiare è possibile, con una ricerca globale e sostituire.

Ci sono una cosa come "la creazione di una costante" nel database di letteratura.Costanti di esistere in quanto tale e spesso chiamato valori.È possibile dichiarare una variabile e assegnare un valore (costante) ad esso.Dal scolastica vista:

DECLARE @two INT
SET @two = 2

Qui due @è una variabile e 2 è un valore costante.

La risposta migliore è da SQLMenace secondo il requisito di se che è quello di creare un temporaneo costante per l'uso all'interno di script, cioèin più ANDARE a dichiarazioni/batch.

Basta creare la procedura in tempdb quindi non hanno alcun impatto sul database di destinazione.

Un esempio pratico di questo è un database, creare script che scrive un valore di controllo alla fine dello script contenente lo schema logico versione.All'inizio del file sono alcuni commenti con il cambiamento della storia ecc...Ma in pratica la maggior parte degli sviluppatori si dimentica di scorrere verso il basso e aggiornare la versione dello schema in fondo al file.

Utilizzando il codice di cui sopra consente visibile versione dello schema costante per essere definito all'inizio prima che il database script (copiato dal generare script di sql server management studio) crea il database, ma usato alla fine.Questo è giusto in faccia dello sviluppatore accanto a cambiare la storia e altri commenti, in modo che siano molto probabile un suo aggiornamento.

Per esempio:

use tempdb
go
create function dbo.MySchemaVersion()
returns int
as
begin
    return 123
end
go

use master
go

-- Big long database create script with multiple batches...
print 'Creating database schema version ' + CAST(tempdb.dbo.MySchemaVersion() as NVARCHAR) + '...'
go
-- ...
go
-- ...
go
use MyDatabase
go

-- Update schema version with constant at end (not normally possible as GO puts
-- local @variables out of scope)
insert MyConfigTable values ('SchemaVersion', tempdb.dbo.MySchemaVersion())
go

-- Clean-up
use tempdb
drop function MySchemaVersion
go
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top