Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all 7251 articles
Browse latest View live

Вставка НЕПОВТОРЯЮЩИХСЯ текстовых строк (nvarchar(4000))

$
0
0
Есть задача: в справочник (ID int primary key, Value nvarchar(4000)) нужно вставлять строки и получить на выходе ID новой строки или существующей (если есть таковая). Ограничение одно - строки не должны повторяться!
И тут настает сложность: поле Value - нельзя проиндексировать и установить уникальность на уровне индекса (ограничение SQL - 900 байт на индексируемое поле), а искать по нему надо.

Сложность задачи еще в том, что это будет высоконагруженный блок с большим кол-вом данных (млн+) в котором данные льются с большой скоростью. И вставка должна быть максимально быстрой....

Чтобы ускорить поиск по текстовому полю - мы ввели поле ValueHash bigint (индексируем это поле). Теперь поиск получается по ValueHash быстрым - но это не гарантия выбора единственной записи...

В итоге - Если использовать IF (NOT EXISTS(...)) INSERT INTO... (или MERGE - что похоже) то все равно складывается ситуация, когда 2 потока могут вставить запись с одинаковым Value (при уровне изоляции транзакции меньше чем SERIALIZABLE - а если SERIALIZABLE - то дэдлок).

Помогите решить вопрос - наверняка кто-то сталкивался с такой задачей в больших системах... Нужно организовать вставку с получением ID без задвоения Value и без дэдлоков...

Прикладываю хранимку на вставку...

CREATE PROCEDURE dbo.ModuleNameInsertValue
	@value nvarchar(4000),
	@valueHash bigint
AS
SET NOCOUNT ON;

-- переменная для возврата значения
declare @Id int	SET @Id = 0

--SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION 

BEGIN TRY  
	-- сливаем записи в @hashed - точность хеша не 100%, но сюда попадется очень МАЛО (чаще всего одна) записей полюбасу
	declare @hashed table (Id int, [Value] nvarchar(4000), [ValueHash] bigint)
	INSERT INTO @hashed
		SELECT Id, [Value], [ValueHash] FROM [dbo].[ModuleName] WHERE [valueHash] = @valueHash

	-- т.к. записей мало - то даже поиск по nvarchar(4000) будет быстрым
	SELECT @Id = Id FROM @hashed WHERE [ValueHash] = @valueHash AND [Value] = @value -- тут уже точно одна
	IF (@Id = 0) BEGIN
		INSERT INTO dbo.[ModuleName] ([Value], [ValueHash]) VALUES (@value, @valueHash)
		SET @Id = SCOPE_IDENTITY(); 
	END
	IF @@TRANCOUNT > 0  COMMIT TRANSACTION
END TRY  
BEGIN CATCH  
	BEGIN
		IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
		THROW;
	END
END CATCH;



RETURN @Id
GO

Проверка целостности в плане обслуживания завершается ошибкой

$
0
0
Здравствуйте. Есть такая проблема: проверка целостности выполняемая в плане обслуживания завершается вот такой ошибкой.

Выполняется от имени пользователя: Sервер\Админ.Программа выполнения пакетов Microsoft (R) SQL Server Version 10.50.6000.34 for 64-bit (C) Корпорация Майкрософт (Microsoft Corporation), 2010. Все права защищены. Начало: 16:22:04 Выполнение: 2016-08-17 16:22:05.31 Источник: {E7B5DFB9-98A2-4857-BD36-13DEA155AECF} Выполнение запроса "DECLARE @Guid UNIQUEIDENTIFIER EXECUTE msdb..sp...".: 100% завершено Конец выполнения DTExec: завершено исполнение пакетаDTSER_FAILURE (1). Начало: 16:22:04 Готово: 16:22:05 Прошло:0.717 секунд. Не удалось выполнить пакет. Шаг завершился с ошибкой.


Когда же запускаю руками команду
DBCC CHECKDB()
, то ошибок нет
С чем это может быть связано?

Помогите пожалуйста удалить одинаковые строки

$
0
0
Добрый день, заполняю БД и случайно ввел одинаковые строки, пытаюсь удалить возникает ошибка.

Как переименовать ВРЕМЕННУЮ таблицу?

$
0
0
exec sp_rename не работает, видимо из-за того, что для exec создаётся новое подключение и он не видит временную таблицу?!

Как установить msde после MS SQL Server 2005?

$
0
0
На ОС Windows Server 2003 установлен MS SQL SERVER 2005.
При попытке установить сверху msde выдаются сообщения об ошибках.
Как установить msde рядом с SQL Server 2005?

insert into () exec proc

$
0
0
Выполняю:
IF OBJECT_ID('tempdb..#TabSps') IS NOT NULL BEGIN
	DROP TABLE #TabSps
END
CREATE TABLE #TabSps (tab_n VARCHAR(4), fio VARCHAR(254), f_data1 DATETIME, f_data2 DATETIME, note VARCHAR(254))
INSERT INTO #TabSps (tab_n, fio, f_data1, f_data2, note) EXEC Fakt_pris_1C '20160815', '20160816', '3952', NULL, NULL, 0

получаю:
[OLE/DB provider returned message: Новая транзакция не может быть учтена указанным координатором транзакций. ]
OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].
Msg 7391, Level 16, State 1, Procedure Fakt_pris_1C, Line 36
The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.

@@VERSION
Microsoft SQL Server  2000 - 8.00.760 (Intel X86)   Dec 17 2002 14:22:05   Copyright (c) 1988-2003 Microsoft Corporation  Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 1) 

настройки DTC:

Картинка с другого сайта.

Как правильно настроить DTC чтобы insert into () exec proc выполнялось без ошибок? И чем это может быть чревато, если машина является "сервером" электронной проходной на базе MS SQL? Большое спасибо!

Развейте сомнения, пож.!

$
0
0
Всем доброго времени суток!
Предыстория.
Есть процедура. Ничего сложного, но в ней, в частности, есть такое:
truncate table Table1 
insert Table1
select ... from ....

и далее:
select ... from t1
left join Table1 on ...


Все бы ничего, но на самом деле эта процедура используется для формирования отчета_1 RS, в чем так же нет никакого криминала. Но этот отчет_1 - болванка, которая используется в другом отчете, где этот отчет_1 вложен 4 раза с различными наборами параметров.
Как ни странно, все работает и отчет строится за приемлемое время и, вроде, каждый в соответствии со своими параметрами.
А я никак не могу понять, почему?


К такой конструкции перешел после мучений с табличной переменной. Время выполнения отчета было непредсказуемо, то 1 мин, то 1 час и, понятно, зависело от состояния tempdb.

И, собственно вопрос:
По идее RS должен бы запустить все 4 варианта отчета каждый в своем потоке, и что там будет с Table1? Транзакциями не управляю, все по умолчанию.

Извиняйте за много букв.

Соединение с MS SQL из Java jdbc

$
0
0
Уже голову с утра сломал, не найду причину.
Есть две базы на одном инстансе. Загружены jdbc драйвера для ms sql.
При попытке соединиться с ms sql на одной базе всё в порядке, а на другой ошибка:
автор
Драйверу не удалось установить безопасное соединение с SQL Server, используя шифрование SSL. Ошибка: "SQL Server вернул неполный ответ. Соединение было закрыто. ClientConnectionId:d96d77cb-e332-4e1b-9e0e-16769b9775c2".
com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667)
com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1668)
com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1323)
com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java)
com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
java.sql.DriverManager.getConnection(DriverManager.java:583)
java.sql.DriverManager.getConnection(DriverManager.java:187)
MSSQLtest.getid(MSSQLTEST:46)

похожее встретил только, но решения там нет
http://www.sql.ru/forum/1026605/drayveru-ne-udalos-ustanovit-bezopasnoe-soedinenie-s-sql-server-ispolzuya-shifrovanie-ss

При этом раньше работало. Думаю решение где-то на поверхности, но в упор не найду.
Соединяюсь так:
             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
             Connection conn = DriverManager.getConnection(db_connect_string, db_userid, db_password);

Требуется помощь в написании запроса

$
0
0
Уважаемые профессионалы, помогите новичку.

в БД имеется исходная таблица состоящая из одного столбца - вида

молоко
сыр
масло
'тушенка'
'хлеб'
'соль'
'пиво'
'топленое молоко 'Лето' маслосырпром'

задача: в MSSQL 2008R2 убрать пробелы в начале или конце строк (там где они есть), и также поступить с кавычками, пробелы и кавычки в середине строк при этом убирать не надо

Подсветка синтаксиса в SSMS 2016

$
0
0
Всем доброго дня.

Встречался кто нибудь с проблемой что в SSMS 2016 отсутствует частично подсветка синтаксиса, из нам привычного SSMS 2008?
Первое что бросается в глаза так это строковые литералы(красный) и встроенные функции(розовый). И то и другой просто красится черным цветом.

Количество одновременно подключенных баз к SQL Express 2008 R2

$
0
0
Не смог найти ответ на следующий вопрос.

Ограничение на одну базу SQL Express 2008 R2 - 10Гб

А сколько таких баз можно одновременно подключить к этому серверу?


-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?

Запрос на изменения NULL

$
0
0
Добрый день.
Необходимо соединить строку из ячеек если в какой, то ячейки есть NULL необходимо его заменить на запятую.
Пробую использовать replace

К примеру

drop table #t1

create table #t1
(a varchar(10) null,
b varchar(10) null,
c varchar(10) null)

insert into #t1 (a,b,c) values ('1','2','3')

select a+','+replace(b,NULL,',')+','+c
 from #t1


Выводится результат NULL

а должно быть a,,c

Триггер UPDATE срабатывает при INSERT

$
0
0
Здравствуйте!
Подскажите, как сделать правильно:
Есть 2 простых триггера INSERT и UPDATE на одной таблице:

INSERT
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [tr_tab_I]
   ON tTab
   FOR INSERT
AS

BEGIN
    SET NOCOUNT ON;

....

END


UPDATE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [tr_tab_U]
   ON tTab
   FOR UPDATE
AS

BEGIN
    SET NOCOUNT ON;

....

END


При обновлении записи в таблице tTab срабатывает триггер tr_tab_U (все нормально).
При вставке записи в таблицу tTab срабатывает триггер tr_tab_I и затем срабатывает триггер tr_tab_U.

Как сделать, чтобы при вставке записи в таблицу tTab срабатывал ТОЛЬКО триггер INSERT tr_tab_I. а триггер UPDATE tr_tab_U не срабатывал.

частичный distinct

$
0
0
У меня есть таблица с 4 полями

Хочу выбрать 4 поля(f1,..,f4) так, чтобы

f2 f3 f4 были уникальными

то есть строки вида
1 2 3 4
2 2 3 4


для меня одинаковые и пускай вернется любая из двух

Не могу придумать как такое написать

Генерация случайной string по определённой маске

$
0
0
Нужна генерация строки вида:
А3Р2-Ю9С0-Л5К5-Ф1П2
То есть
[А...Я][0-9][А...Я][0-9]-[А...Я][0-9][А...Я][0-9]-[А...Я][0-9][А...Я][0-9]
Я не знаю, стоит ли пытаться это делать средствами SQL через хранимую процедуру, поэтому первое что пришло в голову это
подключить готовое решение на c++.

Что посоветуете?


PS Microsoft SQL Server 2012 X64 Express

Нестрогое соответсвие строковых полей в секции WHERE

$
0
0
Добрый день!
В одной программе в хранимой процедуре есть строки со следующим кодом:

DELETE Table1
FROM Table2
where Table1.Field1 = Table2.Field1


Field1 в обоих таблицах типа строка. Иногда возникает ситуация, когда Table1.Field1 содержит Table2.Field1, но не равно ему (например Table1.Field1 = "абвгд", а Table2.Field1 = "абв") В связи с этим из Table1 могут быть удалены лишние строки. Подскажите пожалуйста, каким образом поменять код, чтобы при сравнении полей учитывалось строгое их равенство?
P.S. используется SQL Server 2005 Express

Успешно в плане обслуживания, но ошибка в джобе

$
0
0
Добрый день, коллеги !!!
автор
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4319.0 (X64) Jun 17 2014 18:50:01 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Давно не случалось у меня ничего из разряда мистики, но вот теперь не пойму в чём дело. Суть в чём, журнал плана обслуживания показывает успешное выполнение задания, а вот соответствующий ему джоб выдаёт ошибку. Подробностей нигде не могу увидеть, ни в журнале джоба и его шагов, ни в журнале ms sql и его агента, ни в логах windows.

З.Ы.: в якобы невыполненном шаге сказано следующие.
журнал задания на шаге
Сообщение:
Программа выполнения пакетов Microsoft (R) SQL Server
Version 10.50.4319.0 for 64-bit
(C) Корпорация Майкрософт (Microsoft Corporation), 2010. Все права защищены.

Начало: 21:30:00
DTExec: завершено исполнение пакетаDTSER_FAILURE (1).
Начало: 21:30:00
Готово: 2:41:47
Прошло:18707.2 секунд


З.З.Ы: что уже было сделано и не помогло:
1) Полностью переделал план обслуживания, создал новый, как раз искомый temp, ошибка не исчезла.
2) Ребут сервера не помог.
3) Проверил сугубо ETL-пакет в SSIS запуском через параметр "проверить пакет без выполнения", ошибок не выдаёт.

перевод coledatetime

$
0
0
Приветствую!

Есть сторонняя программа, которая пишет в MSSQL дату в формате coledatetime (прим. 42599,6635901273). Увы, но я не силен в СИ, и в MSSQL работаю только как select, insert.
Можно как-то в mssql конвертнуть это в более менее понятное для дальнейшей работы в php?

Заранее спасибо.

ssms без []

$
0
0
Привет всем.
Ну вот бесит меня эти []
когда я их таущ драг-дроп как список полей или имена таблиц.
имхо в 99% не нужны

зы есть у меня самодельные скрипты к-е делают много чего без них
но не всегда есть доступ
можно где-то (в реестре ??) подкрутиь это дело чтоб без них.

getdate() в начале и в конце процедуры (отрицательное время выполнения процедуры в логе)

$
0
0
Подскажите, пожалуйста, может быть кто сталкивался:

Есть процедура, которая формирует запрос на linked-сервере. И выполняет его. В начале и в конце процедуры выполняется логирование запуска/окончания - пишется значения getdate() в поля PrcStart (при старте процедуры) и PrcStop (в ту же запись, последним действием) соответственно.

Смотрю лог: дата окончания на несколько миллисекунд меньше даты старта. Порядка 10 - 30 мсек.

Я туплю или это реально такое может быть?

Есличо, getdate() оба раза вызывается с локального сервера.
Версия: MSSQL 2008 R2 (standard, кажется)

--------------------------
No ROM Basic...
Viewing all 7251 articles
Browse latest View live