Frage

Ist es ein Weg, um eine TSQL-variable konstant?

War es hilfreich?

Lösung

Nein, aber Sie können eine Funktion erstellen und hardcode es in und verwenden.

Hier ist ein Beispiel:

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

SELECT dbo.fnConstant()

Andere Tipps

Mein workaround für fehlende constans geben Hinweise über den Wert der Optimierung.

DECLARE @Constant INT = 123;

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

Dies teilt der Abfrage-compiler zur Behandlung der variable, als wenn es eine Konstante bei der Erstellung des Ausführungsplans.Der Nachteil ist, dass Sie haben, um zu definieren, den Wert zweimal.

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

Pseudo-Konstanten, keine Variablen oder Parameter.Stattdessen sind Sie einfach Ansichten mit einer Zeile, und genügend Spalten zur Unterstützung Ihres Konstanten.Mit diesen einfachen Regeln, die SQL-Engine komplett ignoriert der Wert der Blick aber immer noch erstellt einen Ausführungsplan, basierend auf seinem Wert.Der Ausführungsplan nicht zeigen sogar eine Verknüpfung zu der Ansicht!

Nein, aber die guten alten Namenskonvention verwendet werden sollte.

declare @MY_VALUE as int

Es gibt keine integrierte Unterstützung für Konstanten, die in T-SQL.Sie könnte verwenden SQLMenace Ansatz zu simulieren (auch wenn man nie sicher sein kann, ob jemand anderen überschrieben hat die Funktion zurück etwas anderes...), oder vielleicht schreiben Sie eine Tabelle mit Konstanten, wie vorgeschlagen hier.Vielleicht schreiben Sie einen trigger, der rollt sich zurück etwaige änderungen an den ConstantValue Spalte?

Vor der Verwendung einer SQL-Funktion führen Sie das folgende Skript, um zu sehen, die Unterschiede in der Leistung:

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

Wenn Sie interessiert sind in immer optimale Ausführungsplan für einen Wert in die variable, die Sie verwenden können, eine dynamische sql-code.Es macht die variable, Konstante.

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

Für enums oder einfach Konstanten, eine Ansicht mit einer einzelnen Zeile hat große Leistung und Kompilierzeit überprüfen / Nachverfolgung von Abhängigkeiten ( die Ursache der eine Spalte name )

Siehe Jared Ko ' s blog post https://blogs.msdn.microsoft.com/sql_server_appendix_z/2013/09/16/sql-server-variables-parameters-or-literals-or-constants/

erstellen der Ansicht

 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]

verwenden Sie die Ansicht

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

Okay, mal sehen

Konstanten sind unveränderliche Werte, die zur Kompilierzeit bekannt und ändern sich nicht für die Lebensdauer des Programms

das bedeutet, dass Sie nie haben eine Konstante in SQL Server

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

der Wert, der gerade geändert

Da es keine build-in-Unterstützung für Konstanten, meine Lösung ist sehr einfach.

Da dies nicht unterstützt:

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

Ich würde einfach konvertieren

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

Offensichtlich, diese stützt sich auf das ganze (den Wert ohne Leerzeichen und den Kommentar) eindeutig sein.Eine änderung ist es möglich, mit eine Globale Suche und ersetzen.

Es gibt keine solche Sache wie "Schaffung eines Konstanten" in der Literatur-Datenbank.Konstanten existieren, wie Sie sind und Häufig genannte Werte.Kann man eine variable deklarieren, und weisen Sie einen Wert (Konstante) zu.Von einem scholastischen Ansicht:

DECLARE @two INT
SET @two = 2

Hier @zwei ist eine variable und 2 ist ein Wert/konstant.

Die beste Antwort ist vom SQLMenace entsprechend der Anforderung wenn, dass ist das erstellen einer temporären Konstanten für die Verwendung in Skripten, d.h.über mehrere GO-Anweisungen/Chargen.

Erstellen Sie einfach die Prozedur in der tempdb-dann haben Sie keine Auswirkungen auf die Ziel-Datenbank.

Ein praktisches Beispiel dafür ist ein Datenbank-Skript erstellen, das schreibt eine Stellgröße, die am Ende der Skript, das logische schema version.An der Spitze der Datei sind einige Kommentare mit änderungshistorie etc...In der Praxis aber die meisten Entwickler vergessen nach unten scrollen und aktualisieren Sie die schema-version am unteren Rand der Datei.

Mit dem obigen code ermöglicht eine sichtbare schema-version-Konstante definiert werden, an der Spitze, bevor die Datenbank-Skript (kopiert aus dem generieren von Skripts verfügen über SSMS) erstellt die Datenbank, aber am Ende benutzt.Dies ist direkt in das Gesicht von dem Entwickler neben der Geschichte ändern und die Kommentare von anderen, so sind Sie sehr wahrscheinlich zu aktualisieren.

Zum Beispiel:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top