Преобразование из 36 системы счисления в 10 и обратно на T-SQL
36->10
CREATE PROCEDURE [Convert36To10] @Res36 CHAR(9), @Deci INT OUTPUT AS
SET NOCOUNT ON
DECLARE @j INT
DECLARE @Arr36 CHAR(36)
SELECT @Arr36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SELECT @Deci = 0
SELECT @j = 1
while @j <= LEN(LTRIM(RTRIM(@Res36)))
begin
if @j <> 1
SELECT @Deci = @Deci*36
SELECT @Deci = @Deci + CHARINDEX(SUBSTRING(LTRIM(RTRIM(@Res36)), @j,1),@Arr36) -1
SELECT @j = @j+1
end
10->36:
CREATE PROCEDURE [Convert10To36] @Deci INT, @Res36 CHAR(9) OUTPUT AS
SET NOCOUNT ON
DECLARE @j INT
DECLARE @Arr36 CHAR(36)
SELECT @Arr36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SELECT @Res36 = ''
SELECT @j = LOG(@Deci)/LOG(36) +1
while @j>0
begin
SELECT @Res36 = LTRIM(RTRIM(@Res36)) + SUBSTRING(@Arr36, @Deci/POWER(36,@j-1) +1 ,1)
SELECT @Deci = @Deci%POWER(36,@j-1)
SELECT @j =@j-1
end
Для SQL Server 2000 данные процедуры можно оформить в виде UDF (пользовательские функции)
При выполнении оператора SQL выдается ошибка Timeout expired
Возможно данный оператор выполняется дольше выставленного таймаута, то есть времени по истечении которого оператор считается зависшим. Увеличить это время можно с помощью следующей конструкции Команда.CommandTimeOut=0, где Команда является объектом ADODB.Command
Как получить доступ к данным на других SQL серверах
Один из вариантов. В запросе в предложении FROM вместо database.owner.object_name нужно использовать linked_server.database.owner.object_name Для этого при помощи процедуры sp_addlinkedserver нужно прописать этот сервер на нашем SQL сервере.
Доступ к реквизиту в запросе по регистру через 3 (три) точки
Симптомы
В запросе определяю переменные ... |Место = Регистр.Транзакции.Место; |Филиал = Регистр.Транзакции.Место.Филиал; ... На ВыполнитьЗапрос 1С вылетает (некорректный синтаксис в запросе). Если перем "Филиал" не определять, то все работает. Я в курсе, что есть проблема с уровнем вложенности переменной в запросе, но может это как можно обойти?
Регистр.Транзакции — остатков. В тоже время есть регистр оборотный, там определение переменных с 3 точками проходит.
Объяснение
Во-первых, ошибка зависит только от релиза 1С. Это ясно видно в SQL Profiler. Я выяснил как обойти эту проблему.
1. Если переменные с 3 точками явно в группировках запроса не участвуют, тогда их не нужно включать. У меня была ситуация — в универсальном отчете пользователю необходимо было определять все возможные группировки и получать нужные разрезы. Вот я и определял сразу все переменные, которые могли участвовать в запросе, а дальше шло наложение условий и группировок. На DBF это проходило, поэтому я и не загружался такой проблемой.
2. Все же в запросе можно определять переменные с 3 точками, но в этом случае ОБЯЗАТЕЛЬНО по ним должна быть группировка (или условие). Причем таких переменных (с 3 точками) может быть несколько, но тогда по всем ним должны быть группировки. Не допускается ситуация, когда сначала идет группировка по переменной с 2 точками, а затем группировка по переменной с 3 точками — это также приводит к ошибке.
Напомню, что речь идет о запросе по регистру остатков, с оборотным регистром такого не наблюдается.
Можно ли использовать "свои" триггеры в базе 1C?
Да. В начале триггера обязательно должно быть set nocount on.
Если с посмощью ADO читать данные в модуле проведения документа, возникает ошибка timeout expired. Как лечить?
set transaction isolation level read uncommitted
Ошибка при выполнении отчетов Incorrect syntax near "ХХХХ"
Данная ошибка возникает при неправильной интерпретации запроса 1С в запрос на SQL Server. Возникает синтаксическая ошибка (дословный перевод). Таким образом ошибка в самой 1С, точнее в том релизе, который вы используете. Относительно стабильными релизами в этом отношении считаются 15, 18, 19, 20 (на март 2003). 16 и 17 релизы довольно часто грешат такими ошибками.
Ошибка при проведении документов A floating point exception occured in the user process. Current transaction is canceled
В одной из статей Microsoft Knowledge Base данная ошибка объясняется конвертацией значения 0/0 в вещественное (float) значение при передаче в качестве параметра хранимой процедуры. В этой же статье написано, что данная ошибка исправлена в SQL Server 7.0 Service Pack 4. В SQL Server 2000 данная ошибка возникает при конвертации значения в числовой (numeric) параметр. Почему это связано с проведением документов можно объяснить так: при проведении документа используются различные ХП для расчета итогов (как для БИ, так и для ОУ), поэтому появление такой ошибки вполне возможно.
Лекарство Для SQL Server 2000 по моей информации (2 случая) помогает установка Service Pack 2.
При использовании ADO, если запрос возвращает числовое значение, выдается сообщение "Тип переменной не поддерживается"
Дело в том, что 1С похоже воспринимается только строковые значение. Поэтому для SQL Server используйте функции convert или cast, а для DBF функцию STR.
При пересчете итогов возникает ошибка "SQL State 22003 Native 8115 arithmetic overflow error converting numeric to data type numeric"
Скорее всего у вас произошло переполнение бухгалтерских итогов. Случится это может по разным причинам. Например, если суммы по аналитике не списываются или если документ формирует проводки с большими суммами. Отследить это можно просто — выполнив запрос по таблице _1sentry с условием по реквизитам SUM_,AMOUNT,CUSUM, а также по таблице итогов _1sbkttl по реквизиту SD, OBDT(KT).