Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Вопросы новичка к уважаемым экспертам  [new]
мимолётом
Guest
studieren
а множества REPLACE не сильно будет сказаться на производительность? Ведь для него я должен буду очень развернутое представление (или функцию) писать, чтобы все эти реквизиты вытащить.

а что мешает перед тем, как вычислять значение для подстановки проверить, используется ли оно в шаблоне?
3 дек 10, 13:44    [9881781]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
ё
Guest
studieren
ё,

Скажите ё, а множества REPLACE не сильно будет сказаться на производительность? Ведь для него я должен буду очень развернутое представление (или функцию) писать, чтобы все эти реквизиты вытащить.
В принципе я сейчас начинаю понимать, что такой подход кажется лучше. Юзеры как я не умеют писать запросы. Я такой вариант не рассматривал раньше из-за множества REPLACE.


ну, во-первых, как я выше сказал, вы можете сделать это НЕ в одной функции,
а разделить эти замены как-то "тематически" )

и, скорее всего, вам нужно будет получать в результате замену только для одного контрагента
сколько это изменённых разных шаблонов ? 1-2-..5 - не тысяча ведь ?
думаю что со скоростью будет вполне сносно

вот например, результаты, по той функции, ссылку на которую я давал (это на очень-очень-очень НЕ сервере)
declare @s varchar(3000)
declare @d datetime

set @s = 'Хочу создать скалярную функцию, у которой единственный параметр "@SQL Varchar(MAX)".
Функция должна "попытаться" извлечь результирующее значение SQL запроса (т.е. использовать EXECUTE внутри TRY ... CATCH ...).
Если произойдёт ошибка, то функция возвращает текст ошибки.
Если всё О.К., то результирующее значение SQL запроса.'

set @d = getdate()

select [dbo].[ufn_EnName](@s)

print datediff(millisecond, @d, getdate())
KHOCHU SOZDAT' SKALYARNUYU FUNKTSIYU, U KOTOROJ EDINSTVENNYJ PARAMETR "@SQL VARCHAR(MAX)".
FUNKTSIYA DOLZHNA "POPYTAT'SYA" IZVLECH' REZUL'TIRUYUSHCHEE ZNACHENIE SQL ZAPROSA (T.E. ISPOL'ZOVAT' EXECUTE VNUTRI TRY ... CATCH ...).
ESLI PROIZOJDYET OSHIBKA, T

(1 row(s) affected)

50
3 дек 10, 13:57    [9881915]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
ё,

Попробовал у себя. Сервер ругается, что нету "dbo.ufn_EnName". Я так понимаю, это у Вас скалярная функция, которая использует REPLACE.
Ну если результат всего лишь 50 миллисекунд, то ВПЕЧАТЛЯЕТ!

Спасибо за совет. Убедили!
3 дек 10, 14:11    [9882060]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
studieren,

Есть ли у кого готовая функция перевода (транслит) с руского на английский
3 дек 10, 14:16    [9882118]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
Ken@t, ё, Glory

Дааааа ребята! REPLACEов бояться в лес не ходить!
3 дек 10, 14:54    [9882481]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
лолл
Member

Откуда:
Сообщений: 450
studieren,

функций бояться - не программировать =)
3 дек 10, 15:44    [9882912]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
.NET
Member

Откуда: Москва->Петушки
Сообщений: 8258
pkarklin
Хочу создать скалярную функцию, у которой единственный параметр "@SQL Varchar(MAX)".
Функция должна "попытаться" извлечь результирующее значение SQL запроса (т.е. использовать EXECUTE внутри TRY ... CATCH ...).


Ваша функция никуда не годится. Нельзя грабить корованы... )))
Советую вам сделать функции где эльфы в деревянных домиках набигают... )))


pkarklin
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)


Ага, ага. Попробуйте померить скорость света в разных системах отсчёта, может это вам поможет. ))))
3 дек 10, 17:00    [9883608]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
.NET,

помоему Вы усилено напутали ,адрессата своих сообщений
3 дек 10, 17:18    [9883750]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
.NET
Member

Откуда: Москва->Петушки
Сообщений: 8258
Maxx
.NET,

помоему Вы усилено напутали ,адрессата своих сообщений


Да я извиняюсь перед pkarklin. )
3 дек 10, 17:42    [9883922]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
Я тут поэкспериментировал на счёт скалярной функции и наткнулся на странное сообщение сервера.

Создаю таблицу
CREATE TABLE dbo.SQL_Value (Value Varchar(MAX), Error Bit);

Создаю ХП
CREATE PROCEDURE dbo.p_ValueOfExecutedQuery_Text
(@SQL AS Varchar(MAX))
/*	Хранимая процедура необходима для функции "dbo.f_ValueOfExecutedQuery_Text"
	и она выполняет промежуточную задачу: получить результируемое значение
	SQL запроса и разместить в таблицу "SQL_Value". А функция в свою
	очередь получает значения из данной таблицы и удаляет все записи из неё.
*/
AS
BEGIN
	IF @SQL Is Null OR LEN(@SQL) = 0
	RETURN;

	DELETE dbo.SQL_Value;

	BEGIN TRY
		INSERT INTO dbo.SQL_Value (Value)
		EXECUTE (@SQL);
	END TRY
	BEGIN CATCH
		/*	Возникла ошибка. Возможно неверный текст запроса. Формируем
			сообщение об ошибке и отмечаем как ошибка.
		*/
		INSERT INTO dbo.SQL_Value (Value, Error)
		SELECT 'Error number: ' + CAST(ERROR_NUMBER() AS Varchar(20)) +
			'   Error message: ' + ERROR_MESSAGE(), 1;
		RETURN;
	END CATCH

	--	Итак, ошибки нет. Можно отмечать полученное значение как неошибочное.
	UPDATE dbo.SQL_Value
	SET Error = 0;

	--	Проверка
	--	SELECT TOP 1 * FROM dbo.SQL_Value;
END

Теперь собственно и создаю скалярную функцию
CREATE FUNCTION dbo.f_ValueOfExecutedQuery_Text
(@SQL AS Varchar(MAX))
/*	Функция исполнит указанный запрос и возвратит полученное
	значение.
*/
RETURNS Varchar(MAX)
AS
BEGIN
	DECLARE @Text AS Varchar(MAX);

	/*	Динамический SQL и TRY... CATCH ... недопустим в функциях.
		Поэтому воспользуемся хранимой процедурой
		"dbo.p_ValueOfExecutedQuery_Text".
	*/
	EXECUTE dbo.p_ValueOfExecutedQuery_Text @SQL;
	SELECT @Text = Value FROM dbo.SQL_Value

	RETURN @Text;
END

Сервер все выполняет до этой точки. Но потом странное сообщение.
Хочу запустить такой скрипт, но получаю ругательство:
SELECT dbo.f_ValueOfExecutedQuery_Text('SELECT CustomerID FROM dbo.tblCustomer') AS КодКлиента;

Only functions and some extended stored procedures can be executed from within a function.

Как понять слова "some extended stored procedures"? Это какие ХП можно использовать в функциях а какие нет?

P.S.
Меня данный вопрос интересует чисто теоретически. В реальных БД я пока не планирую использовать.
7 дек 10, 08:05    [9896165]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
studieren,

Что допустимо и не допустимо в функициях, найти можно тут.
7 дек 10, 08:41    [9896237]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP,

А еще лучше - здесь :)
7 дек 10, 08:43    [9896243]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
studieren
Only functions and some extended stored procedures can be executed from within a function.

Как понять слова "some extended stored procedures"? Это какие ХП можно использовать в функциях а какие нет?

P.S.
Меня данный вопрос интересует чисто теоретически. В реальных БД я пока не планирую использовать.
Создание расширенных хранимых процедур
Важно!
В будущей версии Microsoft SQL Server эта возможность будет удалена. Не используйте ее при работе над новыми приложениями и как можно быстрее измените приложения, в которых она в настоящее время используется. Пользуйтесь вместо этого интеграцией со средой CLR.
7 дек 10, 10:27    [9896782]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
Уважаемый гуру, есть у меня небольшой вопросик.

Вот этот запрос возвращает пустой набор записей:
SELECT 1 AS Test
WHERE 1/0=0 AND 1<>1;
А вот этот запрос возвращает ошибку:
SELECT 1 AS Test
WHERE 1/0=0 AND 1=1;

Вопрос: а почему и 1-запрос НЕ возвращает ошибку? Ведь по идее и там деление на 0 имеет место?
Вот если бы было наоборот в условиях отбора
SELECT 1 AS Test
WHERE 1<>1 AND 1/0=0;
то я мог бы предположить, что сервер проверяет первое же условие отбора и если не соответствуют данные, то дальше и не станет проверять. Но здесь первое же условие ОШИБОЧНОЕ!!!
В чём тут дело?
4 фев 11, 14:36    [10184505]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В чём тут дело?

а вы в план выполнения загляните.

Posted via ActualForum NNTP Server 1.4

4 фев 11, 14:41    [10184555]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
studieren,

порядок проверки условий в WHERE и где бы то ни было ещё определяет
только сервер независимо от того порядка, который написали Вы.
Посмотреть этот порядок можно в тексте плана выполнения запроса.
При этом в будущем, после добавления новых данных в таблицу,
сервер выберет другой план, который он посчитает более оптимальным,
и, возможно, будет ругаться и в первом варианте Вашего запроса.
4 фев 11, 14:42    [10184566]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
studieren,

порядок проверки условий в WHERE и где бы то ни было ещё определяет
только сервер независимо от того порядка, который написали Вы.
Посмотреть этот порядок можно в тексте плана выполнения запроса.
При этом в будущем, после добавления новых данных в таблицу,
сервер выберет другой план, который он посчитает более оптимальным,
и, возможно, будет ругаться и в первом варианте Вашего запроса.
Чего-то я не обратил внимание, что запрос-то не из таблицы.
Но всё равно на всё воля сервера!
4 фев 11, 14:45    [10184589]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

для наглядности можно так:
set showplan_all on
go
SELECT object_id
from sys.objects
WHERE 1/0=0 AND 1<>1;
go
SELECT object_id
from sys.objects
WHERE 1/0=0 AND 1=1;
:)

Posted via ActualForum NNTP Server 1.4

4 фев 11, 14:48    [10184614]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
Barbie
Member

Откуда:
Сообщений: 9
Подскажите пожалуйста, как можно поле с ФИО (пример, Сергеев Михаил Васильевич) модефицировать в поле Фамилия, инициалы (пример Сергеев М.В.) в таблице с момощью TransactSQL.
7 фев 11, 10:37    [10195010]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Barbie
Подскажите пожалуйста, как можно поле с ФИО (пример, Сергеев Михаил Васильевич) модефицировать в поле Фамилия, инициалы (пример Сергеев М.В.) в таблице с момощью TransactSQL.
Была такая тема
И не одна. Ищите по строке "ФИО"
7 фев 11, 10:44    [10195044]     Ответить | Цитировать Сообщить модератору
 Image VS Varbinary(max)  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
В BOLе написано следующее:
Использование типов данных text и image
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Используйте вместо этого типы данных varchar(max), nvarchar(max) и varbinary(max).


Воспользовавшись советом BOLа я для хранения файлов в таблице создал поле с типом данных varbinary(max), но у меня то и дело на клиенте (MS Access) очень часто выходит сообщение об ошибке (см. картинку). Поменял тип данных на image и у меня перестало выходить такое сообщение.
Так какой же тип данных лучше для хранения файлов внутри таблиц?

К сообщению приложен файл. Размер - 19Kb
27 май 11, 08:59    [10717014]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
studieren
В BOLе написано следующее:
Использование типов данных text и image
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Используйте вместо этого типы данных varchar(max), nvarchar(max) и varbinary(max).


Воспользовавшись советом BOLа я для хранения файлов в таблице создал поле с типом данных varbinary(max), но у меня то и дело на клиенте (MS Access) очень часто выходит сообщение об ошибке (см. картинку). Поменял тип данных на image и у меня перестало выходить такое сообщение.
Так какой же тип данных лучше для хранения файлов внутри таблиц?
SELECT @@VERSION
что говорит?
27 май 11, 09:02    [10717022]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
Владимир СА,

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86) Apr 2 2010 15:53:02 Copyright (c) Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
27 май 11, 09:08    [10717046]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
studieren
Воспользовавшись советом BOLа я для хранения файлов в таблице создал поле с типом данных varbinary(max), но у меня то и дело на клиенте (MS Access) очень часто выходит сообщение об ошибке (см. картинку).
Из твоего сообщения можно предположить, что все таки иногда при типе данных varbinary(max) у тебя происходит сохранение.?
Тогда дело возможно в клиенте (MS Access) или в драйвере...
У меня на C# все в легкую сохраняет в varbinary(max)...
М.б. действительно оставить image...
27 май 11, 09:29    [10717167]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы новичка к уважаемым экспертам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
Владимир СА
Из твоего сообщения можно предположить, что все таки иногда при типе данных varbinary(max) у тебя происходит сохранение.?


Ну да. Иногда без проблем сохраняет, а некоторых файлов на отрез отказывается. Какая тут закономерность не понятно. В основном это файлы Excel, которых я использую в качестве шаблона для отчётов (иногда юзерам надо "подправлять" некоторые отчёты, поэтому Excel для меня самое удобное решение).
Ну тогда оставлю "image", т.к. с ним проблем меньше. Ну а если сервер поменяю на новый, тогда и подумаю, что делать с "image".
У меня SS 2010 нет под рукой. Не подскажите там "image" ещё жив или убрали уже?
27 май 11, 09:40    [10717201]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить