Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
900
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
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
Могу ли я поддерживать состояние между вызовами SQL Server UDF?
У меня есть скрипт SQL, который вставляет данные (через операторы INSERT, которые в настоящее время числятся в тысячах), один из столбцов содержит уникальный идентификатор (хотя и не тип IDENTITY, а простой ol' int), который на самом деле уникален в нескольких разных таблицах.
Я хотел бы добавить функцию scalar в свой скрипт, который получает следующий доступный ID (т. е. последний раз использовался ID + 1), но я не уверен, что это возможно, потому что, похоже, нет способа использовать глобальную или статическую переменную из UDF, я не могу использовать временную таблицу, и я не могу обновить постоянную таблицу из функции.
В настоящее время мой скрипт выглядит так:
declare @v_baseID int
exec dbo.getNextID @v_baseID out --sproc to get the next available id
--Lots of these - where n is a hardcoded value
insert into tableOfStuff (someStuff, uniqueID) values ('stuff', @v_baseID + n )
exec dbo.UpdateNextID @v_baseID + lastUsedn --sproc to update the last used id
Но я бы хотел, чтобы это выглядело так:
--Lots of these
insert into tableOfStuff (someStuff, uniqueID) values ('stuff', getNextID() )
Жесткое кодирование смещения-это боль в заднице и подвержено ошибкам. Упаковка его в простую функцию scalar очень привлекательна, но я начинаю думать, что это не может быть сделано таким образом, поскольку, похоже, нет способа поддерживать счетчик смещения между вызовами. Это правда, или есть что-то, что я упускаю.
На данный момент мы используем SQL Server 2005.
правки для уточнения:
Два пользователя ударяя это не произойдет. Это сценарий обновления, который будет выполняться только один раз и никогда одновременно.
Фактический sproc не имеет префикса sp_, исправлен пример кода.
В обычном использовании мы используем таблицу идентификаторов и sproc, чтобы получить IDs по мере необходимости, я просто искал более чистый способ сделать это в этом скрипте, который по существу просто сбрасывает кучу данных в БД.
Я начинаю думать, что это не может быть сделано таким образом, поскольку, похоже, нет способа поддерживать счетчик смещения между вызовами. Это правда, или есть что-то, что я упускаю.
Я начинаю думать, что это не может быть сделано таким образом, поскольку, похоже, нет способа поддерживать счетчик смещения между вызовами. Это правда, или есть что-то, что я упускаю.
Вы ничего не упускаете; сервер SQL не поддерживает глобальные переменные, и он не поддерживает изменение данных в пределах UDFs. И даже если вы хотите сделать что-то вроде kludgy, как с помощью CONTEXT_INFO (см. http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx), вы не можете установить это из UDF в любом случае.
Есть ли способ обойти "hardcoding" смещения, сделав эту переменную и зациклив ее на итерации, делая вставки в этом цикле?
Если у вас есть 2 пользователя, нажимая его в то же время они получат тот же идентификатор. Почему бы вам не использовать таблицу идентификаторов с идентификатором вместо этого, вставить в нее и использовать ее в качестве уникального (гарантированного) идентификатора, это также будет выполняться намного быстрее
sp_getNextID
никогда не префикс procs с sp_, это имеет значение производительности, потому что оптимизатор сначала проверяет master DB, чтобы увидеть, существует ли этот proc там, а затем локальный DB, а также если MS решит создать sp_getNextID в пакете обновления, ваш никогда не будет выполнен
Вероятно, это будет больше работы, чем стоит, но вы можете использовать статические переменные C#/VB в SQL CLR UDF, поэтому я думаю, что вы сможете делать то, что хотите, просто увеличивая эту переменную каждый раз, когда вызывается UDF. Статическая переменная будет потеряна всякий раз, когда выгружается домен приложения, конечно. Поэтому, если вам нужна непрерывность вашего ID от одного дня до следующего, вам понадобится способ, при первом доступе к NextId, опросить все таблицы, которые используют этот ID, чтобы найти самое высокое значение.