При разработке сайта Автокредитование: калькулятор автокредита столкнулся с проблемой: на одном из хостинг-серверов админы установили SQL Server 2008 вместо SQL Server 2008. При попытке подключения со своей локальной машины к этому серверу через SQL Server Management Studio 2005 закончилась неудачей. Management Studio 2005 сообщила, что не не рассчитана на подключение к данной версии SQL Server-а. Установливать SQL Server 2008 и идущий с ней Management Studio 2008 мне пока не было необходимости, поэтому нашлось другое решение.
Для начала я установил у себя Microsoft SQL Server 2005 Service Pack 2. После этого установил последний на нынешний момент апдейт на SP2: Cumulative update package 12 for SQL Server 2005 Service Pack 2 (server).
И, наконец, самое главное: Cumulative update package 12 for SQL Server 2005 Service Pack 2 (naitive client)
После этого теперь мой SQL Server Management Studio 2005 успешно заходит на SQL Server 2008.
Замечу однако, что в SQL Server 2008 Express Edition with Advanced Services при попытке открытия таблицы (Open Table) или именения ee (Design) вываливается ошибка
Неопознанная ошибка (MS Visual Database Tools)
хотя в то же время запросы в Management Studio выполняются и результаты отображаются нормально.
Показаны сообщения с ярлыком SQL. Показать все сообщения
Показаны сообщения с ярлыком SQL. Показать все сообщения
четверг, 26 марта 2009 г.
вторник, 3 февраля 2009 г.
LINQ to SQL Как получить случайную запись из таблицы SQL Server
Мне нужно было получить случайную запись из определенной таблицы в базе данных SQL Server.
В моем случае у меня была таблицы цитат и мне нужно было случайным образом выбирать запись(или записи) для отображения на веб-сайте. Кроме того я использовал LINQ to SQL на этом сайте, таким образом решение должно использовать эту технологию и, кроме того, быть достаточно простым и универсальным.
Идея заключалась в сортировке записей по случайному параметру а затем получении TOP n количества записей. Функция NEWID() из SQL Server выглядит хорошим кандидатом для получения случайного параметра, так как она генерирует GUID.
В SQL Server, попробуйте следующий запрос:
Сейчас для для нашего кода мы должны сгенерировать подобное поведение на .NET. Мне нужно было получить эквивалент NEWID() в моем LINQ to SQL DBML. Отмечу, что мы не можем непосредственно использовать NEWID() в хранимой процедуре или функции, так как SQL Server выдаст ошибку: “Invalid use of side-effecting or time-dependent operator in 'newid' within a function”. В обход этого мы создадим view который использует NEWID() и функцию, которая будет выбирать из этого view.
В DBML, мы просто перетащим таблицу Quote, а затем функцию GetNewID в дизайнер. Следующий код выбирает случайную запись из таблицы Quotes.
Фактически мы можем выбирать любое количество записей из любой таблицы.
В моем случае у меня была таблицы цитат и мне нужно было случайным образом выбирать запись(или записи) для отображения на веб-сайте. Кроме того я использовал LINQ to SQL на этом сайте, таким образом решение должно использовать эту технологию и, кроме того, быть достаточно простым и универсальным.
Идея заключалась в сортировке записей по случайному параметру а затем получении TOP n количества записей. Функция NEWID() из SQL Server выглядит хорошим кандидатом для получения случайного параметра, так как она генерирует GUID.
В SQL Server, попробуйте следующий запрос:
SELECT * FROM Quote ORDER by NEWID();
SELECT TOP 1 * FROM Quote ORDER by NEWID();
Сейчас для для нашего кода мы должны сгенерировать подобное поведение на .NET. Мне нужно было получить эквивалент NEWID() в моем LINQ to SQL DBML. Отмечу, что мы не можем непосредственно использовать NEWID() в хранимой процедуре или функции, так как SQL Server выдаст ошибку: “Invalid use of side-effecting or time-dependent operator in 'newid' within a function”. В обход этого мы создадим view который использует NEWID() и функцию, которая будет выбирать из этого view.
CREATE VIEW [dbo].[RandomView]
AS
SELECT NEWID() As ID
GO
CREATE FUNCTION [dbo].[GetNewId]
(
)
RETURNS uniqueidentifier
AS
BEGIN
RETURN (SELECT ID FROM RandomView)
END
GO
В DBML, мы просто перетащим таблицу Quote, а затем функцию GetNewID в дизайнер. Следующий код выбирает случайную запись из таблицы Quotes.
DataContext db = new QuoteDataContext();
var quote = db.Quote.OrderBy(q => db.GetNewId()).First();
Фактически мы можем выбирать любое количество записей из любой таблицы.
вторник, 6 января 2009 г.
ЗКак уменьшить размер базы данных MS SQL Server
На хостинг-серверах обычно существует квота для базы данных MS SQL Server. Даже если ваша база данных содержит не много данных, но идет интенсивное добавление/модификация данных, то в определенный момент размер базы данных может превысить выделенный лимит и ваш аккаунт может быть, как говорят буржуи, "suspended".
Это может произойти по причине увеличения transaction log.
Очистиь его можно командой:
BACKUP LOG [databasename] WITH TRUNCATE_ONLY
После чего нужно будет еще сделать Shrink Database.
Для примера, размер базы данных сайта, который мне доводится обслуживать, уменьшился с 890MB до 12MB.
Стоит также отметить, что до следующего бекапа ваша БД остается незащищенной (на случай отказа оборудования и т.п.), так как transaction log мы очистили.
Замечу также, что в SQL Server 2008 "WITH TRUNCATE_ONLY" не поддерживается. Поэтому очистить лог перед Shrink-ом можно переключив Recovery Model из режима Full в Simple.
Это может произойти по причине увеличения transaction log.
Очистиь его можно командой:
BACKUP LOG [databasename] WITH TRUNCATE_ONLY
После чего нужно будет еще сделать Shrink Database.
Для примера, размер базы данных сайта, который мне доводится обслуживать, уменьшился с 890MB до 12MB.
Стоит также отметить, что до следующего бекапа ваша БД остается незащищенной (на случай отказа оборудования и т.п.), так как transaction log мы очистили.
Замечу также, что в SQL Server 2008 "WITH TRUNCATE_ONLY" не поддерживается. Поэтому очистить лог перед Shrink-ом можно переключив Recovery Model из режима Full в Simple.
Ярлыки:
база данных,
размер,
BACKUP LOG,
Server,
SQL,
transaction log,
TRUNCATE_ONLY
Подписаться на:
Сообщения (Atom)
