Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Есть ли способ сделать переменную TSQL постоянной?
Есть ли способ сделать переменную TSQL постоянной?
Мой обходной путь к отсутствующим константам заключается в том, чтобы дать подсказки о значении оптимизатору.
DECLARE @Constant INT = 123;
SELECT *
FROM [some_relation]
WHERE [some_attribute] = @Constant
OPTION( OPTIMIZE FOR (@Constant = 123))
Это говорит компилятору запроса, чтобы он обрабатывал переменную, как если бы она была константой при создании плана выполнения. Недостатком является то, что вы должны определить значение дважды.
Используйте псевдо-константы: http://blogs.msdn.com/b/sql_server_appendix_z/archive/2013/09/16/sql-server-variables-parameters-or-literals-or-constants.aspx
Псевдоконстанты не являются переменными или параметрами. А вместо этого они просто ... просто просмотры с одной строкой и достаточным количеством столбцов для поддержки Вашего константы. С помощью этих простых правил движок SQL полностью игнорирует значение представления, но по-прежнему строит план выполнения на основе его значение. План выполнения даже не показывает соединение с представлением!
В T-SQL нет встроенной поддержки констант. Вы можете использовать подход SQLMenace для его моделирования (хотя вы никогда не можете быть уверены, что кто-то другой перезаписал функцию, чтобы вернуть что-то другое...), или, возможно, написать таблицу, содержащую константы, как это предлагается здесь . Может быть, написать триггер, который откатывает любые изменения в столбце ConstantValue ?
Перед использованием функции SQL выполните следующий сценарий, чтобы увидеть различия в производительности:
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
Если вы заинтересованы в получении оптимального плана выполнения Для значения переменной, вы можете использовать динамический код sql. Это делает переменную постоянной.
DECLARE @var varchar(100) = 'some text'
DECLARE @sql varchar(MAX)
SET @sql = 'SELECT * FROM table WHERE col = '''+@var+''''
EXEC (@sql)
Для enums или простых констант представление с одной строкой имеет большую производительность и время компиляции проверки / отслеживания зависимостей ( причина его имя столбца )
Смотрите запись в блоге Джареда ко https://blogs.msdn.microsoft.com/sql_server_appendix_z/2013/09/16/sql-server-variables-parameters-or-literals-or-constants/
создайте представление
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]
использовать представление
SELECT h.*
FROM Sales.SalesOrderHeader
WHERE ShipMethodID = ( select [OVERNIGHT J-FAST] from ShipMethods )
Ладно, посмотрим
Константы-это неизменяемые значения, которые известны во время компиляции и не изменяются в течение всего срока службы программы
это означает, что вы никогда не сможете иметь константу в SQL сервере
declare @myvalue as int
set @myvalue = 5
set @myvalue = 10--oops we just changed it
значение просто изменилось
Поскольку нет никакой сборки в поддержку констант, мое решение очень простое.
Так как это не поддерживается:
Declare Constant @supplement int = 240
SELECT price + @supplement
FROM what_does_it_cost
Я бы просто превратил его в
SELECT price + 240/*CONSTANT:supplement*/
FROM what_does_it_cost
Очевидно, что это зависит от того, что все это (значение без пространства trailing и комментария) будет уникальным. Изменить его можно с помощью глобального поиска и замены.
В литературе по базам данных нет такого понятия, как "creating a constant". Константы существуют сами по себе и часто называются значениями. Можно объявить переменную и присвоить ей значение (константу). С точки зрения схоластики:
DECLARE @two INT
SET @two = 2
Здесь @two-это переменная, а 2 - это value/constant.
Лучший ответ-от SQLMenace в соответствии с требованием, если это означает создание временной константы для использования в скриптах, т. е. через несколько GO statements/batches.
Просто создайте процедуру в базе данных tempdb, тогда вы не будете иметь никакого влияния на целевую базу данных.
Одним из практических примеров этого является скрипт создания базы данных, который записывает управляющее значение в конце скрипта, содержащего версию логической схемы. В верхней части файла находятся некоторые комментарии с историей изменений и т.д... Но на практике большинство разработчиков забудут прокрутить вниз и обновить версию схемы в нижней части файла.
Использование приведенного выше кода позволяет определить видимую константу версии схемы в верхней части до того, как сценарий базы данных (скопированный из функции генерировать сценарии SSMS) создаст базу данных, но будет использоваться в конце. Это прямо перед лицом разработчика рядом с историей изменений и другими комментариями, поэтому они с большой вероятностью обновят его.
Например:
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