Вопрос: Гарантирует ли ORDER BY порядок вставки в таблицу?
Ответ: нет не гарантирует
НО есть маленькая особенность, если таблица содержит поле IDENTITY(!!!)
Если перенос данных делать через
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
То в разных ситуация может получиться разная картина, и даже так:
Col1 Col2 ID
------- -------- --------
1 A 4
2 Z 2
7 G 5
11 F 3
17 I 1
Если вставку делать в таблицу, которая создана заранее и содержит поле IDENTITY, то вставка:
INSERT INTO NewTable (Col1, Col2) SELECT Col1, Col2 FROM OldTable ORDER BY Col1
ГАРАНТИРУЕТ, что поле идентити будет следовать согласно полю по которому идёт сортировка
ID (identity) Col1 Col2
------------- ------ ------
1 1 S
2 2 z
3 7 G
4 11 F
5 17 I
Но это не гарантирует, опять же, физический порядок вставки. Вся особенность в том, что во втором случае значения поля идентити генерятся ДО самой вставки на базе условия ORDER BY.
ЗЫ: Печально, что в BOL это не описано, точнее убого описано и споров в форумах на эту тему нашёл больше, чем рассчитывал.
Ссылки по теме:
http://blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx
http://support.microsoft.com/kb/273586/en-us/
Спасибо Алексею Князеву за предоставленую информацию.
Данный блог, является записной книжкой. По работе приходится узнавать новые технологии, проводить тесты и сравнения, для хранения результатов решил создать данный блог дабы здесь выкладывать все свои находки и раскопки :)
среда, 26 января 2011 г.
пятница, 21 января 2011 г.
Удаление дублей в таблице без первичных ключей
Задача:
Необходимо одним запросом удалить дублирующийся строки в таблице, записи в которой не имеют уникальных ключей
Решение:
WITH cte
AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY name) id, * FROM table
)
DELETE FROM cte WHERE id > 1
P.S.: Данное решение возможно только на MS SQL серверах выше 2000 версии
Необходимо одним запросом удалить дублирующийся строки в таблице, записи в которой не имеют уникальных ключей
Решение:
WITH cte
AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY name) id, * FROM table
)
DELETE FROM cte WHERE id > 1
P.S.: Данное решение возможно только на MS SQL серверах выше 2000 версии
понедельник, 29 ноября 2010 г.
Лекции по Системам реального времени
Отсканированные лекции по Системам реального времени, готовимся к зачету =)
P.S.: Спасибо Игорю Мартемьянову
Леции
P.S.: Спасибо Игорю Мартемьянову
Леции
четверг, 25 ноября 2010 г.
Методичка и Задачник по Организации и Планированию производства
пятница, 15 октября 2010 г.
Получение пользователей из AD на C#
using System;
using System.DirectoryServices;
using System.Collections;
using System.Linq;
using System.IO;
class Program
{
static void Main(string[] args)
{
DirectoryEntry de = new DirectoryEntry("LDAP://"+serverName, userName, password);
DirectorySearcher deSearch = new DirectorySearcher();
deSearch.SearchRoot = de;
deSearch.Filter = "(&(objectClass=user))";
deSearch.SearchScope = SearchScope.Subtree;
SearchResultCollection results = deSearch.FindAll();
foreach (SearchResult result in results)
{
DirectoryEntry entity = result.GetDirectoryEntry();
if ((entity.SchemaEntry.Name == "user") && (entity.Name.IndexOf("CN=") != -1))
{
Console.Write(entity.Name.Substring(3) + "\n");
}
}
}
}
using System.DirectoryServices;
using System.Collections;
using System.Linq;
using System.IO;
class Program
{
static void Main(string[] args)
{
DirectoryEntry de = new DirectoryEntry("LDAP://"+serverName, userName, password);
DirectorySearcher deSearch = new DirectorySearcher();
deSearch.SearchRoot = de;
deSearch.Filter = "(&(objectClass=user))";
deSearch.SearchScope = SearchScope.Subtree;
SearchResultCollection results = deSearch.FindAll();
foreach (SearchResult result in results)
{
DirectoryEntry entity = result.GetDirectoryEntry();
if ((entity.SchemaEntry.Name == "user") && (entity.Name.IndexOf("CN=") != -1))
{
Console.Write(entity.Name.Substring(3) + "\n");
}
}
}
}
четверг, 19 августа 2010 г.
Переводим Hex в обычный текст на C#
Задача: Данные шифрованные в HEX. Необходимо прочитать их.
Пример: Из 4d79206e616d652044656e6973 получаем My name Denis
Пример кода на C# реализующий эту задачу.
string hexString = richTextBox1.Text;
byte[] tmp;
int j = 0;
tmp = new byte[(hexString.Length) / 2];
for (int i = 0; i <= hexString.Length - 2; i += 2)
{
tmp[j] = (byte)Convert.ToUInt32(Int32.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.HexNumber));
j++;
}
richTextBox1.Text = Encoding.GetEncoding(1252).GetString(tmp);
Для этого не обходимо WinForm, на нее выкинуть richTextBox1 и Button1 =)
P.S.: Проверить можно тут
Спасибо за советы Tricks_Ter
Пример: Из 4d79206e616d652044656e6973 получаем My name Denis
Пример кода на C# реализующий эту задачу.
string hexString = richTextBox1.Text;
byte[] tmp;
int j = 0;
tmp = new byte[(hexString.Length) / 2];
for (int i = 0; i <= hexString.Length - 2; i += 2)
{
tmp[j] = (byte)Convert.ToUInt32(Int32.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.HexNumber));
j++;
}
richTextBox1.Text = Encoding.GetEncoding(1252).GetString(tmp);
Для этого не обходимо WinForm, на нее выкинуть richTextBox1 и Button1 =)
P.S.: Проверить можно тут
Спасибо за советы Tricks_Ter
Подписаться на:
Сообщения (Atom)