Сенситивный, или чувствительный, тип личности – один из типов, где наибольшую роль играет не биологический фактор, а социальный. Такой человек часто неуверен в себе, излишне чувствителен, а в некоторых случаях и обладает патологическими расстройствами психики. Как строить общение с такими индивидами и на какие акцентуации характера стоит обращать внимание, рассмотрим далее.
О причинах и акцентуациях
Фото Omid Armin on Unsplash
Причин формирования этого тип несколько:
- одна из основных причин – деспотичная мать, которая пытается контролировать действия своего ребенка. В результате развиваются неуверенность в себе и страх. Человек старается угодить матери, чтобы не стать жертвой насилия — словесного, а часто и физического в первые годы жизни. Чувствительность становится защитной реакцией;
- деструктивное воздействие примера отца или отчима. При условии, что он проявляет открытую агрессию — бьет ребенка, ругает его;
- скрытая агрессия родителей. Она проявляется по типу — «ты мне мешаешь, попробуй угадать почему»;
- родители вообще не обращают внимания на ребенка, делая из него взрослого, который вынужден сам решать проблемы. В этом случае возможны варианты. Или человек становится взглядом независимого взрослого и берет на себя роль, которая ему не по силам.
Или он пытается полюбить родителей, почувствовать их настроение и приспособиться к ситуации. Оба случая приводят к разрушительным последствиям для психики и развитию негативных моделей поведения в будущем.
Зная причины, можно значительно улучшить эффективность общения с такими людьми. Если ты узнала в приведенных примерах своих родителей, то, возможно, обладаешь чертами сенситивного типа.
Основные акцентуации
Акцентуация характера – это психологический термин, который описывает наиболее отличительные черты.
Чувствительный тип личности – это акцент, который выделил психолог Личко. Характерные черты:
- повышенная мягкость, ранимость и чувствительность;
- доброта; мечтательность;
- завышенные требования к себе;
- заниженная самооценка;
- застенчивость;
- невозможность отказать;
- излишняя исполнительность и целеустремленность;
- склонность к замалчиванию проблем, обидчивости, плаксивости.
Таким людям сложно найти себя в жизни и в обществе. Особенно, если человек – представитель «сильного» пола, так как в действие вступают стереотипы. Часто сенситивные люди становятся объектом насмешек, а затем и молчаливого избегания. Стоит отметить и наличие серьезно заниженной самооценки, вплоть до самоуничтожающих мыслей и обвинения себя во всех грехах.
Основные сферы интереса – красота, изысканность, искусство. Как правило, у этих людей хороший вкус и эстетическая точность.
Сенситивный тип личности
Кстати, среди детей чувствительный тип не встречается в чистом виде. Развитие акцентуаций происходит в более позднем периоде (14-19 лет). Ряд исследователей считают, что наличие любой акцентуации является отклонением от нормы.
Однако, сенситивность стоит принимать как одну из особенностей личности до тех пор, пока она не мешает вести качественный образ жизни: быть здоровой, строить счастливые отношения, продвигаться по карьере и т.д.
Симптомы и примеры сенситивного типа
В качестве примеров можно привести следующие:
- человек боится животных, одиночества и темноты. Даже в зрелом возрасте остаться один на один с темнотой бывает очень трудно;
- избегает шумных компаний, стремится к одиночеству;
- не любит агрессивные фильмы, книги, передачи, игры;
- не общается с незнакомцами, а в компании предпочитает общаться с 1-2 людьми, избегая столпотворения;
- любит рукоделие, рисование, чтение в одиночестве;
- его часто посещают суицидальные мысли. Окружающие могут и не подозревать об этом. А попытки суицида в данном случае не носят показной характер и часто заканчиваются плачевно.
- Сенситивные люди не склонны к алкоголизму, наркомании или преступному поведению. При алкогольном опьянении часто наблюдается не эйфория, а депрессивная реакция с усилением чувства неполноценности.
Возможность коммуникации
Если нет психической травмы, усугубляющей акцентуации характера, то в общении человек подобного типа может реализоваться полностью. Особенно если это касается личных или интимных отношений. Если ты общаешься с излишне чувствительным человеком, то помни:
- он не изменится даже при наличии большой любви.
Черты его характера слишком сильны;
- но он останется верным тебе (будь-то муж, или подруга), даже в ущерб себе.
Поэтому, общаясь с чувствительным типом, постарайся не злоупотреблять его отношением. Терпение у таких людей крепкое, но не бесконечное: они уходят раз и навсегда;
- он может жертвовать своими интересами ради других и просто ради общего дела.
Если ты хочешь быть ближе к этому человеку, то старайся не злоупотреблять его жертвенностью;
- он не конфликтует.
От слова «совсем». Люди с таким психотипом всеми силами стараются предотвратить любой спор. Однако, из-за невысказанных эмоций со временем могут развиваться психосоматические заболевания – астма, диабет, онкология. По этой причине, общаясь с таким человеком, старайся не оставлять недосказанности, а решай все вопросы прямо и честно;
- создавай уют дома, если твой муж – чувствительный тип.
Спокойная, уютная атмосфера способствует восстановлению жизненных сил сенситивных людей, благодаря которым они могут эффективно работать, заниматься творчеством, строить отношения.
- В целом, люди с сенситивным типом личности могут стать отличными друзьями и спутниками жизни.
У них есть отрицательные черты – постоянная тревога, склонность к апатии и скуке, но они нивелируются постоянным желанием помочь, добротой. Такие люди по своей природе не способны на подлость.
Личная коррекция
Если ты сама являешься сенситивным человеком, то поработай над отрицательными чертами характера. Также, зная особенности, ты сможешь построить свою жизнь более правильно и рационально:
- наилучший и наиболее эффективный способ реализации — в профессиях, связанных с искусством, интеллектуальной деятельностью либо с помощью людям. Выбирай такие специальности, как художник, дизайнер, музыкант, актер, писатель, юрист, врач, социальный работник;
- дай себе немного передохнуть от чрезмерной ответственности. Не бери на себя чужие обязательства ни в личной жизни, ни в быту, ни в работе. Если ты считаешь, что тебя нагружают сверх нормы, то скажи об этом прямо;
- избавься от людей, которые тянут из тебя энергию. Сенситивные люди просто притягивают к себе отрицательных персонажей, которые с легкостью «садятся на шею»;
- ищи в себе негативные модели поведения и устраняй их. Это не однодневная работа и, возможно, тебе потребуется помощь психотерапевта;
- используй психоанализ, арт-терапию: психотерапевтические сказки, изо-терапию и т.д.
Таким образом, сенситивный тип личности подразумевает такие акцентуации, как излишняя чувствительность к оценке, самообесценивание, застенчивость, стеснение в проявлении любых чувств: радости, любви, грусти. Со временем невозможность проявления эмоций и чувство обиды начинают сказываться на здоровье. Поэтому, если ты обладаешь данным складом личности, то стоит пройти курс занятий с психологом.
Тема урока: «Герои сказки С.Т. Аксакова «Аленький цветочек»»
Метапредметные: создать условия для формирования УУД.
Воспитательные: воспитать интерес к миру русской поэзии и жизни талантливых людей.
Средства: проектор, ноутбук, экран, мультимедийная презентация.
Этап урока
Деятельность учителя
Деятельность учеников
Планируемые результаты
Мотивация
Закончилась перемена,
Прозвенел звонок.
И мы начинаем
Чтения урок.
— Добрый день, ребята! Меня зовут Мария Максимовна. Сегодня я проведу у вас урок литературного чтения. Тихонько садимся.
— Перед началом нашего урока давайте проведём речевую разминку.
— Вспомним правила посадки за столом.
1. Сидим ровно.
2. Ноги стоят ровно.
3. Спинка прижата к стулу.
4. Расстояние между вами и партой должна быть одна ладошка.
— На слайде вы видите небольшое четверостишие, прочитайте его про себя.
на – на – на – во дворе растет сосна;
но – но – но – завтра мы пойдем в кино;
ан – ан – ан – собери свой чемодан;
ин – ин – ин – вы ходили в магазин?
— Теперь читаем вместе в среднем темпе (в быстром темпе, в медленном темпе)
— Молодцы!
Приветствуют учителя, выполняют речевую разминку.
Регулятивные:
- формулировать учебную задачу урока;
- читать в соответствии с целью чтения;
- оценивать свои достижения.
Коммуникативные:
- понимать цель своего высказывания;
- участвовать в диалоге с классом, задавать вопросы;
- проявлять терпимость к другому мнению, не допускать агрессивного поведения.
Предметные:
- читать вслух бегло, осознанно, без искажений, выразительно, передавая своё отношение к прочитанному, выделяя при чтении важные по смыслу слова, соблюдая паузы между предложениями и частями текста;
- задавать вопросы по прочитанному, находить на них ответы в тексте.
Целеполагание
— Давайте вспомним, над каким произведением мы работали на прошлом уроке?
— Кто автор этого произведения?
— А к какому жанру относится это произведение?
— Вспомните, что такое сказка?
— Верно. Сказка – один из жанров фольклора, в котором есть сказочные герои, предметы и происходят волшебные события.
— Сегодня мы с вами продолжим работу над этой замечательной сказкой и постараемся разобрать каждого героя.
— Попробуем сформулировать тему и цель урока.
— Аленький цветочек.
— Сергей Тимофеевич Аксаков.
— К сказке.
Ответы учащихся.
— Тема: герои сказки С.Т. Аксакова «Аленький цветочек».
Цель: дать характеристику героям сказки С.Т. Аксакова «Аленький цветочек».
Личностные:
- проявлять интерес к учебному материалу;
- стремиться к приобретению и углублению знаний;
- управление своим настроением, умение выражать эмоции.
Коммуникативные:
- понимать цель своего высказывания;
- участвовать в диалоге с классом, задавать вопросы;
- проявлять терпимость к другому мнению, не допускать агрессивного поведения.
Открытие нового знания, актуализация знаний.
— Откройте свои тетради, запишите число.
— Давайте вспомним сюжет сказки. Расставьте сюжетные картинки в правильном порядке.
— Вспомните, какие герои встретились вам в этой сказке?
— Перечислите их в ваших
тетрадях (купец, старшая дочь, средняя дочь, младшая дочь, чудище).
Физминутка «Цветок»
Спал цветок…
И вдруг проснулся. (Дети встают)
Больше спать не захотел. (Туловище влево, вправо)
Шевельнулся, потянулся, (Встали на носочки, потянулись)
Взвился вверх и полетел, (Руки влево, вправо) Солнце утром лишь проснется (Потянулись вверх)
Бабочка кружится, вьется. (Дети садятся)
Открывают тетради, записывают число.
Учащиеся расставляют картинки в правильной последовательности.
Записывают: купец, старшая дочь, средняя дочь, младшая дочь, чудище.
Личностные:
- проявлять интерес к учебному материалу;
- стремиться к приобретению и углублению знаний;
- управление своим настроением, умение выражать эмоции.
Познавательные:
- анализировать литературный текст.
Коммуникативные:
- понимать цель своего высказывания;
- участвовать в диалоге с классом, задавать вопросы;
- проявлять терпимость к другому мнению, не допускать агрессивного поведения.
Включение нового знания в систему знаний и повторение
— Давайте выясним, каким характером обладают герои этой сказки: купец, старшая дочь, средняя дочь, младшая дочь, чудище.
— Для этого нам нужно составить таблицу характеристику героев сказки. У меня вы можете наблюдать её на слайде.
— Перечертите таблицу к себе в тетрадь.
Герой сказки | Характеристика героя |
Купец | |
Старшая дочь | |
Средняя дочь | |
Младшая дочь | |
Чудище |
— Первый герой, которого мы будем характеризовать, будет купец.
— Каким чертами характера обладает купец? Подтвердите примерами из текста.
— Следующий герой старшая дочь.
— Как вы можете её охарактеризовать? Заносим характеристику в таблицу.
— Следующий герой средняя дочь.
— Какая она? Подтвердите примерами из текста.
— Следующий герой младшая дочь?
— Что мы можем сказать о младшей дочери? Подтвердите примерами из текста.
— И последний наш герой чудище?
— Какими чертами он обладает? Подтвердите примерами из текста.
— На какие две группы можно разделить героев?
— Каких героев можно отнести к положительной группе? А каких к отрицательной?
— Вот мы с вами и выяснили какими характерами обладают герои этой сказки.
Перечерчивают таблицу.
Герой сказки | Характеристика героя |
Купец | Добрый, щедрый, любит своих дочерей, честный, верен своему слову. |
Старшая дочь | Злая, завистливая, коварная. |
Средняя дочь | Жестокая, жадная, корыстная. |
Младшая дочь | Красивая, добрая, любит отца и сестер, бескорыстная, способная полюбить за душу и доброе сердце, честная, верна своему слову. |
Чудище | Огромное, мохнатое, страшное, но с нежным любящим сердцем. |
— На положительные и отрицательные.
— К положительной группе можно отнести купца, младшую дочь и чудище. К отрицательной – среднюю и старшую дочь.
Регулятивные:
- формулировать учебную задачу урока;
- читать в соответствии с целью чтения;
- оценивать свои достижения.
Познавательные:
- анализировать литературный текст;
- осознают сущность произведений Л.Н. Толстого, великого классика литературы, как часть русской национальной культуры.
Коммуникативные:
- понимать цель своего высказывания;
- участвовать в диалоге с классом, задавать вопросы;
- проявлять терпимость к другому мнению, не допускать агрессивного поведения.
Рефлексия
— Наш урок подошел к концу.
— Какова же была главная цель нашего урока?
— Достигли ли мы её?
— Чему нас учат герои сказки?
— Какие качества вы бы хотели перенять у героев сказки?
— Оцените свою работу на уроке.
Цветовой сигнал
Зеленый – мне было легко работать.
Желтый – испытывал затруднения.
Красный – мне было сложно работать.
— Дать характеристику героям сказки С.Т. Аксакова «Аленький цветочек».
— Да.
Ответы учащихся.
Оценивают свою работу на уроке при помощи приема «цветовой сигнал».
Регулятивные:
- формулировать учебную задачу урока;
- читать в соответствии с целью чтения;
- оценивать свои достижения.
Коммуникативные:
- понимать цель своего высказывания;
- участвовать в диалоге с классом, задавать вопросы;
- проявлять терпимость к другому мнению, не допускать агрессивного поведения.
Стили речи —
это её разновидности, которые используются в той или иной сфере
общественной жизни: в обыденном общении, в официально-деловых отношениях, в
средствах массовой информации, в сфере науки, в художественной литературе.
В
зависимости от сферы употребления выделяют следующие функциональные стили
речи: разговорный, официально-деловой,
публицистический, научный, художественный.
Разговорный
стиль
Разговорный стиль используется
в повседневном общении между людьми с целью поделиться своими мыслями,
чувствами, информацией, высказать побуждения и т. п. Разговорный стиль
функционирует в быту: в домашней обстановке, на улице, в магазине, на работе
между сотрудниками, в неофициальной обстановке.
Основная функция разговорного
стиля — функция общения, обеспечивающая повседневные, бытовые связи между
людьми.
Характерные черты разговорного
стиля: преобладание устной формы речи, неофициальность, непринуждённость,
конкретность, простота, эмоциональность, использование разговорной лексики,
часто с просторечной окраской.
Жанры (разновидности)
разговорного стиля в зависимости от ситуации общения: диалог (беседа),
телефонный разговор, письмо, записка. В последнее время разговорный стиль
обогатился жанром переписки по Интернету, по мобильному телефону (sms).
Обычная форма реализации разговорного
стиля — диалог; этот стиль используется исключительно в устной речи. В нём
отсутствует предварительный отбор языкового материала.
Официально-деловой стиль
Официально-деловой
стиль используется в официальной обстановке: в сферах
делопроизводства, законодательства, дипломатии.
Основные функции официально-делового
стиля — регламентировать отношения между обществом и государством, между
государствами, между гражданами в их трудовой, общественной деятельности, в
сфере имущественных и правовых отношений; информативная функция.
Характерные черты официально-делового
стиля: преобладание письменной формы, официальность, регламентированность,
стандартизация текстов, точность, конкретность, строгость, безличность,
неэмоциональность, преобладание официально-деловой лексики. Для
официально-делового стиля характерно наличие речевых клише, общепринятой формы
изложения, стандартного изложения материала, широкое использование
терминологии и номенклатурных наименований, наличие сложных несокращённых
слов, аббревиатур, отглагольных существительных, преобладание прямого порядка
слов.
Жанры официально-делового
стиля в зависимости от сферы функционирования: законы, уставы, указы, приказы,
постановления, резолюции, ноты, коммюнике, объявления, справки, рапорты,
анкеты, заявления, доверенности, автобиографии, резюме, характеристики, акты,
протоколы, инструкции, контракты, договоры и т. д.
Тип речи официально-делового
стиля — преимущественно рассуждение.
Вид речи —
чаще всего монолог.
Публицистический стиль
Сфера
употребления публицистического
стиля — общественная жизнь, политика, экономика,
культура. Этот стиль обращён к слушателям, читателям — об этом говорит
происхождение его названия (от лат. publicus — общественный).
Основная
функция — обсуждение насущных социальных,
общественных вопросов с целью привлечь к ним общественное мнение,
воздействовать на людей, побуждая к тем или иным поступкам, действиям. Области функционирования: средства
массовой информации, публичные выступления политиков, речи адвокатов в суде,
выступления на собраниях, доклады, дискуссии.
Характерные черты стиля:
актуальность, своевременность, оперативность, образность, экспрессивность,
эмоциональность, оценочность, чёткость, логичность, информационная
насыщенность, использование средств других стилей (особенно
художественного и научного); общедоступность (понятность для широкой
аудитории), тенденциозность, призывный пафос.
Языковые
особенности: широкое использование общественно-политической
лексики; стереотипных, устойчивых оборотов и выражений; совмещение книжной и
разговорной лексики; риторические приёмы (вопросы, восклицания, обращения),
эмоциональная окрашенность речи.
Жанры публицистики:
интервью, репортаж, заметка, статья, очерк, фельетон, доклад, дискуссия,
публичная речь (развлекательная, информационная, агитационная)и т. д.
Тип речи —
преимущественно рассуждение.
Форма речи —
письменная или подготовленная устная.
Вид речи —
монолог, диалог, полилог.
Научный стиль
Научный стиль используется
в сфере научной деятельности в официальной обстановке: на лекциях, семинарах,
конференциях, симпозиумах, коллоквиумах; в научной литературе.
Основная функция —
осуществлять обмен научной информацией, сообщать научные сведения и т. д.
Характерные черты:
официальность, подготовленность речи, сочетание письменной и устной форм,
объективность, логичность, доказательность, точность (однозначность),
обобщённость, использование специальной, профессиональной лексики, терминов,
сложных синтаксических конструкций, ссылок на источники, цитаты.
Жанры:
научная монография, научная статья, научный доклад, тезисы, диссертация,
лекция, рецензия, отчёт, учебное пособие, научно-популярное произведение,
дискуссия и т. д.
Основные подстили научного стиля
Разновидности | Собственно | Научно-учебный | Научно-популярный |
Цель | Выявление и описание новых | Обучить, описать факты, необходимые | Дать представление о науке, заинтересовать |
Адресат | Учёный, специалист в данной | Учащийся, будущий специалист | Любой человек, инте ресующийся |
Художественный стиль
Художественный
стиль — самый богатый стиль речи, т. к. он вбирает в себя все
остальные. В нём наиболее ярко отражается общенародный язык во всём его
многообразии и богатстве, — он становится явлением искусства, средством
создания художественной образности.
Главная функция —
эстетическая. Художественный стиль, используя разнообразные языковые средства,
создаёт образы, вызывающие в душе читателя эмоциональный отклик, доставляющие
эстетическое наслаждение, заставляющие сопереживать. Другие функции: отражение,
преображение всех сторон действительности, использование их как объекта
творчества; воздействие на читателя.
Разновидности художественного стиля: стиль литературного
направления, литературной школы, рода литературы (эпос, лирика, драма),
индивидуальный стиль писателей, поэтов. Характерные черты:
образность, эстетичность, индивидуальность, использование стилистически
окрашенной лексики, изобразительно-выразительных средств (тропов, фигур речи,
звукописи, цветописи), привлечение средств других стилей, особенно
разговорного.
Основные жанры (по
родам литературы): эпос — роман, повесть, рассказ, очерк, новелла, поэма,
басня; лирика — стихотворение, поэма, элегия, песня, послание; драма —
трагедия, драма, комедия, мелодрама, водевиль, трагикомедия.
Таблица: Функционально-смысловые типы речи
Упражнения
Упражнение1:
Прочитайте тексты. Определите, к какому типу речи они
относятся.
I. Облик
аиста хорошо известен: длинный, прямой и острый клюв, длинная шея и длинные
ноги, широкие крылья. Окраска оперения в основном белая, только маховые перья и
задняя часть спины чёрные. Клюв и ноги у взрослых аистов красные, однако у
молодых клюв тёмно-серый, почти чёрный. Вес самцов 2,9—3,6 кг, самок
2,9—3,1 кг. Длина тела (оба пола) 97—110 см, размах крыльев 200—220
см (В. Гричик).
II.
Появляясь весною уже в последней декаде марта, аисты сразу же занимают старые
гнёзда. Расположены они, как правило, на деревьях, но часто встречаются и
гнёзда, устроенные на крышах домов и сараев, водонапорных башнях, опорах ЛЭП.
Иногда же аисты устраивают гнёзда и в необычных местах — например, на
скирдах сена, колодезных журавлях и даже на стреле неработающего крана. Нередко
занимают специально устраиваемые людьми основы для гнёзд в виде деревянных рам
или укреплённых на деревьях колёс. Птицы гнездятся обычно одиночными парами (В. Гричик).
III. Белый
аист стал священной птицей у многих народов. Об этом говорят многочисленные
легенды, сказки, поверья, пословицы. Аисты предпочитают селиться поближе к
человеческому жилью, хотя некоторые выбирают и лес, и речные местности. Гнездо
они используют неоднократно, прилетают в то же место в течение многих лет.
Иногда они безгранично доверяют человеку: спокойно охотятся на лягушек в пруду,
среди деревенских мальчишек, которые, стоя по колено в воде, удят рыбу,
деловито прохаживаются по огороду или по двору в компании с кошкой, собакой и
курами, клюют из тарелки кусочки мяса, оставленные для него
Упражнение 2. Прочитайте приведенные отрывки и
определите, к каким функциональным стилям они принадлежат. Докажите принадлежность
текста к данному стилю (перечислите основные особенности данного стиля с
примерами из текста). Расставьте знаки препинания.
А. Если за 10 дней до
окончания действия договора ни одна из сторон письменно не заявит о своем
намерении расторгнуть договор то договор считается продленным на тот же срок и
тех же условиях По истечении срока действия договора обязательства сторон по
настоящему договору прекращаются Если по заявлению Клиента не будет заключен
новый договор банковского счета счета Клиента открытые в соответствии с пунктом
2.1 настоящего договора закрываются.
Остаток валютных средств на
счетах зачисляется на специальный счет и может быть востребован Клиентом в
течение установленного законом срока исковой давности.
Б. Американский
писатель Уэйн Б. Егер даже книгу выпустил Техника профессионального карманника
которая стала настоящим бестселлером в США Еще бы ведь в Нью-Йорке ежегодно от
щипачей страдает полмиллиона людей Автор утверждает что карманное воровство не
только простое и выгодное но также и достаточно безопасное занятие в России
этот вид кражи относится к разряду трудно раскрываемых преступлений Тем не
менее милиция продолжает бороться с любителями порыться в чужих карманах сумках
кошельках Уголовный кодекс РФ не либеральничает с преступниками В нем есть сто
пятьдесят восьмая статья предусматривающая максимальное наказание до трех лет
лишения свободы а если преступление совершено ранее судимым или организованной
группой до десяти лет.
В. Наиболее
бросающееся в глаза изменение научно-технического потенциала в России в ходе
реформ это его резкое сокращение за счет падения государственного
финансирования объемов работ и соответственно уменьшение числа занятых в сфере
науки и научного обслуживания Сокращение это происходит неравномерно в разных
секторах разных категориях работников разных специальностях но сам факт крупных
кадровых потерь российской науки очевиден и наглядно демонстрируется данными
статистики Вопрос не в доказательстве этого обстоятельства а в его оценке
Мнения высказываемые по данному поводу разноречивы.
Упражнение 3. К каким стилям речи относятся
отрывки? Какая стилевая черта усилена в них благодаря исправлениям?
1) Молодые
кинематографисты пытаются сделать язык кино более выразительным.
Ищут новых красок и старые мастера кино. Но герои многих
произведений всё ещё не обладают яркими характерами.
2) Среди молодых москвичей –
победителей спортивных соревнований много студентов.
3) В яркий солнечный день в
лесу бывает прекрасно.
Упражнение
4:
Какой (-ие) тип (-ы) речи представлен (-ы) в предложениях 1-5?
1) описание
2) повествование и рассуждение
3) повествование и описание
4) повествование
(1)В детстве я ненавидела утренники, потому что к нам в садик приходил отец.
(2)Он садился на стул возле ёлки, долго пиликал на своём баяне, пытаясь
подобрать нужную мелодию, а наша воспитательница строго говорила ему: «Валерий
Петрович, повыше!» (3) Все ребята смотрели на моего отца и давились от смеха.
(4)Он был маленький, толстенький, рано начал лысеть, и, хотя никогда не пил,
нос у него почему-то всегда был свекольно-красного цвета, как у клоуна.
(5)Дети, когда хотели сказать про кого-то, что он смешной и некрасивый,
говорили так: «Он похож на Ксюшкиного папу!»
Упражнение 5. Устраните речевые элементы,
неуместные в строго научном тексте.
Что такое колониальные
птицы? Колониальными называют тех птиц, которые на ограниченной
небольшой территории гнездятся целыми группами, располагая
гнёзда близко друг от друга. Примерами таких птиц могут служить
грачи, чайки, кайры и многие другие.
При работе с неизменяемыми типами данных, такими как readonly struct, нам часто приходится писать методы типа или статические методы расширения, которые создают копию объекта, изменяя определенное свойство или поле. Такие методы позволяют сделать код чище и проще, обеспечивая неизменяемость. Неизменяемость может быть полезной, например, если требуется обеспечить потокобезопасность для типа с состоянием. Обычно каждый подобный метод в качестве единственного аргумента принимает значения поля или свойства, которое нужно изменить, создает неполную измененную копию текущего объекта, используя конструктор, и возвращает эту измененную копию потребителю.
Например, для структуры Person:
public readonly struct Person
{
public readonly string Name;
public readonly int Age;
public Person(string name = "", int age = 0)
{
Name = name;
Age = age;
}
public Person WithName(string name) => new Person(name, Age);
public Person WithAge(int age) => new Person(Name, age);
}
— результатом выполнения методов With… является неполная измененная копия оригинального объекта Person. Копия неполная, потому что для ссылочных свойств и полей, как в данном случае, копируется ссылка на объект. Но это не страшно, так как предполагается, что все типы этих полей или свойств также неизменяемы.
Пример использования методов типа:
var john = new Person().WithName("John").WithAge(15);
Статические методы расширения работают аналогично предыдущим методам, за исключением того, что они имеют еще один дополнительный аргумент для передачи оригинального объекта:
public readonly struct Person
{
public readonly string Name;
public readonly int Age;
public Person(string name = "", int age = 0)
{
Name = name;
Age = age;
}
}
public static class PersonExtensions
{
public static Person WithName(this Person it, string name) =>
new Person(name, it.Age);
public static Person WithAge(this Person it, int age) =>
new Person(it.Name, age);
}
Такой подход применим и к обычным неизменяемым структурам и классам.
Начиная с C# версии 9, можно использовать ключевое слово record для определения ссылочного типа. Он предоставляет встроенные возможности для инкапсуляции данных. Record позволяет создавать записи с неизменяемыми свойствами, используя позиционные параметры или стандартный синтаксис свойств:
public record Person(string Name = "", int Age = 0);
Несмотря на поддержку изменений, записи предназначены в первую очередь для неизменяемых моделей данных. Начиная с C# версии 10, можно определить типы record struct также с помощью позиционных параметров или синтаксиса свойств:
public readonly record struct Person(string Name = "", int Age = 0);
Обычную запись из C# версии 9 можно обозначить более полным выражением record class, где class — это необязательное ключевое слово. Выбор между record class и record struct, соответствует выбору между между class и struct.
С появлением записей появилось и новое ключевое with. Оно создает новый экземпляр записи, который является копией оригинальной и изменяет в этой копии указанные свойства и поля, результатом чего является неполная копия. Для указания требуемых изменений используется синтаксис инициализатора объектов:
var john = new Person() with { Name = "John", Age = 15 };
Синтаксис выглядит лаконичным и легко читаемым. Но существует несколько причин, по которым вспомогательные методы из первых примеров для структур и классов, оказываются предпочтительнее ключевому слову with. Во-первых, не во всех проектах можно использовать записи из-за версии C# и целевой версии фреймворка. А во-вторых, в неизменяемых типах часто встречаются поля или свойства содержащие неизменяемые коллекции объектов.
Например:
public record Person(
string Name = "",
int Age = 0,
ImmutableArray<Person> Friends = default);
При работе с коллекциями использование ключевого слово with выглядит менее читаемо:
var john = new Person() with { Name = "John", Age = 15 }
with { Friends = ImmutableArray.Create(new Person() with {Name = "David"}) };
john = john with
{
Friends = (john.Friends == default ? ImmutableArray<Person>.Empty : john.Friends)
.Add(new Person() with { Name = "Sophia" })
.Add(new Person() with { Name = "James" })
};
john = john with
{
Friends = (john.Friends == default ? ImmutableArray<Person>.Empty : john.Friends)
.Remove(new Person() with { Name = "David" })
};
По этой причине появилась идея Immutype для того, чтобы поручить ему всю рутинную работу по созданию статических методов расширения для поддержки неизменяемости.
Это генератор кода .NET, который делает всю работу одновременно, пока вы пишите код. Он ищет все типы, помеченные атрибутом [Immutype.Target]
, и для каждого такого типа создает статический класс с методами расширения. Эти методы расширения не замусоривают основной код и не маячат своими изменениями в коммитах. Для создания копии объектов используются:
-
позиционные параметры для записей, если таковые имеются
-
конструктор помеченный атрибутом
[Immutype.Target]
, если такой есть -
первый конструктор с наибольшим числом аргументов
Например, для записи:
[Immutype.Target]
public record Person(
int Age,
string Name = "",
ImmutableArray<Person> Friends = default);
— сценарий из примера выше, выглядит так:
var john = new Person(15).WithName("John").WithAge(15)
.WithFriends(new Person(16).WithName("David"));
john = john.AddFriends(
new Person(17).WithName("Sophia"),
new Person(14).WithName("James"));
john = john.RemoveFriends(new Person(16).WithName("David"));
Для обычных свойств или полей, таких как Age создается по одному методу расширения:
Person WithAge(this Person it, int age)
Для свойств или полей со значением по умолчанию в позиционном параметре или в конструкторе, таких как Name, создается дополнительный метод, назначение которого очевидно:
Person WithDefaultName(this Person it)
Для коллекций создается по несколько методов расширения. В нашем случае для Friends будет создано четыре метода.
-
Для того чтобы полностью переопределить коллекцию, через метод с переменным числом аргументов:
Person WithFriends(this Person it, params Person[] friends)
-
Такой же как и выше, но с оригинальным типом в качестве аргумента:
Person WithFriends(this Person it, ImmutableArray<Person> firends)
-
Чтобы создать копию коллекции, добавив переменное число элементов:
Person AddFriends(this Person it, params Person[] friends)
-
Чтобы создать копию коллекции, исключив некоторые элементы:
Person RemoveFriends(this Person it, params Person[] friends)
Контраст в простоте при использовании других типов коллекций еще более очевиден. Например, для записи:
public record Person(
string Name = "",
int Age = 0,
IReadOnlyCollection<Person>? Friends = default);
— наш сценарий с ключевым словом with выглядят так:
var john = new Person()
with { Name = "John", Age = 15 }
with { Friends = new List<Person>{ new Person() with { Name = "David" } }};
john = john with
{
Friends = (john.Friends ?? Enumerable.Empty<Person>())
.Concat(
new List<Person>[]{
new Person() with { Name = "Sophia" },
new Person() with { Name = "James" }})
.ToList()
};
john = john with
{
Friends = (john.Friends ?? Enumerable.Empty<Person>())
.Except(new List<Person> { new Person() with { Name = "David" } })
.ToList()
};
А в случае с Immutype весь код остается прежним для любых коллекций из списка ниже:
T[]
interface IEnumerable<T>
class List<T>
interface IReadOnlyCollection<T>
interface IReadOnlyList<T>
interface ICollection<T>
interface IList<T>
class HashSet<T>
interface ISet<T>
class Queue<T>
class Stack<T>
interface IReadOnlyCollection<T>
interface IReadOnlyList<T>
interface IReadOnlySet<T>
class ImmutableList<T>
interface IImmutableList<T>
struct ImmutableArray<T>
class ImmutableQueue<T>
interface IImmutableQueue<T>
class ImmutableStack<T>
interface IImmutableStack<T>
Immutype также берет на себя обработку случаев с типами, содержащими null или значения по умолчанию. Поддерживает универсальные типы и всевозможные ограничения параметров типа.
Так как Immutype — это генератор кода, он работает только на этапе компиляции и не добавляет каких-либо зависимости на другие сборки, не захламляет исходный код. Для работы Immutype необходим: .NET SDK 5.0.102 или новее. Но он будет работать для разных проектов, например, для .NET Framework 4.5.
Immutype поддерживает инкрементальную генерацию кода, поэтому нагрузка на систему в процессе работы над проектами будет минимальной.
Чтобы начать пользоваться, просто добавьте в ваши проекты ссылку на пакет Immutype и отметьте неизменяемые типы атрибутом [Immutype.Target]
по необходимости.
С дополнительными примерами можно ознакомиться на странице проекта. Буду признателен за конструктивные комментарии, новые идеи и вклад в проект.
Тест производительности
Протестировано использование record и record struct с ключевым словом With и со статическими методами, созданными Immutype, для случаев с одним, двумя и четырьмя свойствами. Типы свойств: string, int и bool.
BenchmarkDotNet=v0.13.1, OS=Windows 10.0.22000
Intel Core i7-10875H CPU 2.30GHz, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.100
[Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
С одним свойством string:
Method | Mean | Error | StdDev | Median | Gen 0 | Allocated |
---|---|---|---|---|---|---|
Immutype record struct | 0.0000 ns | 0.0000 ns | 0.0000 ns | 0.0000 ns | — | — |
With record struct | 0.0317 ns | 0.0287 ns | 0.0307 ns | 0.0240 ns | — | — |
With record | 6.1894 ns | 0.1489 ns | 0.2797 ns | 6.3389 ns | 0.0029 | 24 B |
Immutype record | 7.2829 ns | 0.1577 ns | 0.1619 ns | 7.2482 ns | 0.0029 | 24 B |
С двумя свойствами string и int:
Method | Mean | Error | StdDev | Median | Gen 0 | Allocated |
---|---|---|---|---|---|---|
With record struct | 0.0195 ns | 0.0296 ns | 0.0291 ns | 0.0036 ns | — | — |
Immutype record struct | 0.0442 ns | 0.0257 ns | 0.0352 ns | 0.0285 ns | — | — |
With record | 8.2670 ns | 0.1532 ns | 0.1280 ns | 8.2548 ns | 0.0038 | 32 B |
Immutype record | 10.6809 ns | 0.2420 ns | 0.4424 ns | 10.8150 ns | 0.0076 | 64 B |
С четырьмя свойствами string, int, string и bool:
Method | Mean | Error | StdDev | Median | Gen 0 | Allocated |
---|---|---|---|---|---|---|
Immutype record struct | 0.0409 ns | 0.0074 ns | 0.0058 ns | 0.0407 ns | — | — |
With record struct | 0.0695 ns | 0.0275 ns | 0.0633 ns | 0.0491 ns | — | — |
With record | 10.0555 ns | 0.2268 ns | 0.3790 ns | 9.8518 ns | 0.0048 | 40 B |
Immutype record | 25.2299 ns | 0.5267 ns | 0.8200 ns | 24.9839 ns | 0.0191 | 160 B |
Legends:
-
Mean — Arithmetic mean of all measurements
-
Error — Half of 99.9% confidence interval
-
StdDev — Standard deviation of all measurements
-
Median — Value separating the higher half of all measurements (50th percentile)
-
Gen 0 — GC Generation 0 collects per 1000 operations
-
Allocated — Allocated memory per single operation (managed only, inclusive, 1KB = 1024B)
-
1 ns — 1 Nanosecond (0.000000001 sec)
Производительность Immutype для class и struct будет близкой к производительности для record и record struct. Важно отметить, что значимые траты производительности при использовании статических методов Immutype для ссылочных типов — это проверка входных параметров на null.
- Статья
- Чтение занимает 26 мин
Применимо к: SQL Server (все поддерживаемые версии)
База данных SQL Azure
Управляемый экземпляр SQL Azure
Создает определяемую пользователем функцию. Определяемая пользователем функция представляет собой подпрограмму Transact-SQL или среды CLR, которая принимает параметры, выполняет действия, такие как сложные вычисления, а затем возвращает результат этих действий в виде значения. Возвращаемое значение может быть скалярным значением или таблицей. При помощи этой инструкции можно создать подпрограмму, которую можно повторно использовать следующими способами.
-
В инструкциях Transact-SQL, например SELECT.
-
В приложениях, вызывающих функцию.
-
В определении другой пользовательской функции.
-
Для параметризации представления или улучшения функциональности индексированного представления.
-
Для определения столбца таблицы.
-
Для определения ограничения CHECK на столбец.
-
Для замены хранимой процедуры.
-
Использование встроенной функции в качестве предиката фильтра для политики безопасности
Примечание
- В этом разделе рассматривается интеграция среды CLR .NET Framework с SQL Server. Интеграция со средой CLR не применяется к База данных SQL Azure.
- Azure Synapse Analytics — см. статью CREATE FUNCTION (Azure Synapse Analytics).
Синтаксические обозначения в Transact-SQL
Синтаксис
-- Transact-SQL Scalar Function Syntax
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
-- Transact-SQL Inline Table-Valued Function Syntax
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH <function_option> [ ,...n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
-- Transact-SQL Multi-Statement Table-Valued Function Syntax
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [READONLY] }
[ ,...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
[ ; ]
-- Transact-SQL Function Clauses
<function_option>::=
{
[ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
| [ INLINE = { ON | OFF }]
}
<table_type_definition>:: =
( { <column_definition> <column_constraint>
| <computed_column_definition> }
[ <table_constraint> ] [ ,...n ]
)
<column_definition>::=
{
{ column_name data_type }
[ [ DEFAULT constant_expression ]
[ COLLATE collation_name ] | [ ROWGUIDCOL ]
]
| [ IDENTITY [ (seed , increment ) ] ]
[ <column_constraint> [ ...n ] ]
}
<column_constraint>::=
{
[ NULL | NOT NULL ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor
| WITH ( < index_option > [ , ...n ] )
[ ON { filegroup | "default" } ]
| [ CHECK ( logical_expression ) ] [ ,...n ]
}
<computed_column_definition>::=
column_name AS computed_column_expression
<table_constraint>::=
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ ,...n ]
[ WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
| [ CHECK ( logical_expression ) ] [ ,...n ]
}
<index_option>::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS ={ ON | OFF }
}
-- CLR Scalar Function Syntax
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type
[ = default ] }
[ ,...n ]
)
RETURNS { return_data_type }
[ WITH <clr_function_option> [ ,...n ] ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
-- CLR Table-Valued Function Syntax
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type
[ = default ] }
[ ,...n ]
)
RETURNS TABLE <clr_table_type_definition>
[ WITH <clr_function_option> [ ,...n ] ]
[ ORDER ( <order_clause> ) ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
-- CLR Function Clauses
<order_clause> ::=
{
<column_name_in_clr_table_type_definition>
[ ASC | DESC ]
} [ ,...n]
<method_specifier>::=
assembly_name.class_name.method_name
<clr_function_option>::=
}
[ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
}
<clr_table_type_definition>::=
( { column_name data_type } [ ,...n ] )
-- In-Memory OLTP: Syntax for natively compiled, scalar user-defined function
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type
[ NULL | NOT NULL ] [ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS return_data_type
WITH <function_option> [ ,...n ]
[ AS ]
BEGIN ATOMIC WITH (set_option [ ,... n ])
function_body
RETURN scalar_expression
END
<function_option>::=
{
| NATIVE_COMPILATION
| SCHEMABINDING
| [ EXECUTE_AS_Clause ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Аргументы
OR ALTER
Область применения: SQL Server (начиная с SQL Server 2016 (13.x); с пакетом обновления 1 (SP1)) и База данных SQL Azure
Условно изменяет функцию только в том случае, если она уже существует.
Примечание
Необязательный синтаксис [OR ALTER] для среды CLR доступен, начиная с SQL Server 2016 (13.x); с пакетом обновления 1 (SP1) с накопительным пакетом обновления 1 (CU1).
schema_name
Имя схемы, к которой принадлежит определяемая пользователем функция.
function_name
Имя определяемой пользователем функции. Имена функций должны удовлетворять правилам построения идентификаторов и быть уникальными в пределах базы данных и схемы.
Примечание
Даже при отсутствии аргументов скобки после имени функции обязательны.
@parameter_name
Аргумент пользовательской функции. Может быть объявлен один или несколько аргументов.
Для функций допускается не более 2 100 параметров. При выполнении функции значение каждого из объявленных параметров должно быть указано пользователем, если для них не определены значения по умолчанию.
Определяет имя параметра, используя знак @ как первый символ. Имя параметра должно соответствовать правилам для идентификаторов. Параметры являются локальными в пределах функции, в разных функциях могут быть использованы одинаковые имена параметров. Аргументы могут использоваться только вместо констант. Они не могут использоваться вместо имен таблиц, имен столбцов или имен других объектов базы данных.
Примечание
Параметры ANSI_WARNINGS не годятся для передачи в хранимые процедуры, пользовательские функции и при объявлении и установке переменных в пакетных инструкциях. Например, если объявить переменную как char(3) , а затем присвоить ей значение длиннее трех символов, данные будут усечены до размера переменной, а инструкция INSERT
или UPDATE
завершится без ошибок.
[ type_schema_name. ] parameter_data_type
Тип данных параметра (возможно, с указанием схемы, которой он принадлежит). Для функций Transact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR и определяемые пользователем табличные типы, за исключением типа данных timestamp. Для функций CLR допустимы все типы данных, включая определяемые пользователем типы данных CLR, за исключением типов данных text, ntext, image, определяемых пользователем табличных типов и типов данных timestamp. Нескалярные типы cursor и table не могут быть указаны в качестве типов данных параметров ни для функций Transact-SQL, ни для функций CLR.
Если type_schema_name не указан, Компонент Database Engine выполняет поиск scalar_parameter_data_type в следующем порядке:
- в схеме, содержащей имена системных типов данных SQL Server;
- в установленной по умолчанию для текущего пользователя схеме в текущей базе данных;
- Схема dbo в текущей базе данных.
[ =default ]
Значение по умолчанию для аргумента. Если определено значение default, то функция выполняется даже в том случае, если для данного параметра значение не указано.
Примечание
Для функций CLR также могут указываться значения параметров по умолчанию, кроме типов данных varchar(max) и varbinary(max) .
Если параметр функции имеет значение по умолчанию, то для него должно быть указано ключевое слово DEFAULT для получения функцией значения по умолчанию. Применение ключевого слова DEFAULT следует отличать от использования аргументов со значениями по умолчанию в хранимых процедурах, когда не указанный аргумент неявно принимает значение по умолчанию. Однако ключевое слово DEFAULT не требуется при вызове скалярной функции с помощью инструкции EXECUTE.
READONLY
Указывает, что параметр не может быть обновлен или изменен при определении функции. Параметр READONLY необходим для определяемых пользователем параметров табличного типа (TVP) и не может использоваться для других типов параметров.
return_data_type
Возвращаемое значение скалярной пользовательской функции. Для функций Transact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типа данных timestamp. Для функций CLR допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типов данных text, ntext, image и timestamp. Нескалярные типы cursor и table не могут быть указаны в качестве возвращаемых типов данных ни для функций Transact-SQL, ни для функций CLR.
function_body
Указывает серию инструкций Transact-SQL, совместная работа которых не вызывает побочных эффектов, например изменения содержимого таблиц, и формирует значение функции. function_body используется только в скалярных функциях и функциях с табличным значением из нескольких инструкций (MSTVF).
Для скалярных функций function_body представляет собой ряд инструкций Transact-SQL, которые в совокупности вычисляют скалярное выражение.
Для функций с табличным значением из нескольких инструкций function_body является рядом инструкций Transact-SQL, заполняющих возвращаемую переменную TABLE.
scalar_expression
Указывает скалярное значение, возвращаемое скалярной функцией.
TABLE
Указывает, что возвращаемым значением функции с табличным значением (TVF) является таблица. Функциям с табличным значением могут передаваться только константы и @local_variables.
Во встроенных функциях с табличным значением возвращаемое значение TABLE определяется при использовании единственной инструкции SELECT. Встроенные функции не имеют соответствующих возвращаемых переменных.
В функциях с табличным значением из нескольких инструкций переменной @return_variable является переменная TABLE, используемая для сохранения данных и накопления строк, которые будут возвращены в качестве значения функции. Аргумент @return_variable может быть указан только для функций Transact-SQL, но не для функций CLR.
select_stmt
Единственная инструкция SELECT, которая определяет возвращаемое значение встроенной функции, возвращающей табличное значение (TVF).
ORDER (<order_clause>)
Указывает порядок, в котором возвращаются результаты из функции с табличным значением. Дополнительные сведения см. в разделе Использование порядка сортировки в функциях с табличным значением CLR далее в этом разделе.
EXTERNAL NAME <method_specifier> assembly_name.class_name.method_name
Область применения: SQL Server (SQL Server 2008 с пакетом обновления 1 (SP1) и выше)
Указывает сборку и метод, на которые должно ссылаться имя создаваемой функции.
-
assembly_name — должно соответствовать значению в столбце
name
инструкцииSELECT * FROM sys.assemblies;
.Это имя, которое использовалось в инструкции
CREATE ASSEMBLY
. -
class_name — должно соответствовать значению в столбце
assembly_name
инструкцииSELECT * FROM sys.assembly_modules;
.Часто это значение содержит точку или пунктир. В таких случаях согласно требованиям синтаксиса Transact-SQL значение должно заключаться в квадратные скобки [] или в двойные кавычки «».
-
method_name — должно соответствовать значению в столбце
method_name
инструкцииSELECT * FROM sys.assembly_modules;
.Метод должен быть статическим.
В типичном примере для библиотеки MyFood.DLL, в которой все типы находятся в пространстве имен MyFood, значение EXTERNAL NAME
может быть следующим: MyFood.[MyFood.MyClass].MyStaticMethod
Примечание
По умолчанию SQL Server не производит выполнение кода CLR. Можно создавать, изменять и удалять объекты базы данных со ссылками на модули среды CLR, но SQL Server не выполняет их до тех пор, пока не будет включен параметр clr enabled. Для его включения воспользуйтесь хранимой процедурой sp_configure.
Этот параметр недоступен в автономной базе данных.
<table_type_definition> ( { <column_definition> <column_constraint>| <computed_column_definition> } [ <table_constraint> ] [ ,…n ] )
Определяет тип данных таблицы для функции Transact-SQL. Объявление таблицы включает определения столбцов, а также ограничений для столбцов и таблиц. Таблица всегда помещается в первичную файловую группу.
< clr_table_type_definition > ( { column_name**data_type } [ ,…n ] )
Область применения. SQL Server (SQL Server 2008 с пакетом обновления 1 (SP1) и выше), База данных SQL Azure (предварительная версия в некоторых регионах).
Определяет табличные типы данных для функции CLR. Объявление таблицы включает только имена столбцов и типы данных. Таблица всегда помещается в первичную файловую группу.
NULL | NOT NULL
Поддерживается только для скомпилированных в собственном коде скалярных определяемых пользователем функций. Дополнительные сведения см. в разделе Скалярные определяемые пользователем функции для выполняющейся в памяти OLTP.
NATIVE_COMPILATION
Указывает, скомпилирована ли в собственном коде определяемая пользователем функция. Этот аргумент требуется только для скомпилированных в собственном коде скалярных определяемых пользователем функций.
BEGIN ATOMIC WITH
Поддерживается только для скомпилированных в собственном коде скалярных определяемых пользователем функций и является обязательным. Дополнительные сведения см. в статье Atomic Blocks.
SCHEMABINDING
Аргумент SCHEMABINDING требуется для скомпилированных в собственном коде скалярных определяемых пользователем функций.
EXECUTE AS
Аргумент EXECUTE AS требуется для скомпилированных в собственном коде скалярных определяемых пользователем функций.
<function_option>::= и <clr_function_option>::=
Указывает, что функция будет иметь один или несколько из следующих параметров.
ENCRYPTION
Область применения: SQL Server (SQL Server 2008 с пакетом обновления 1 (SP1) и выше)
Указывает, что компонент Компонент Database Engine преобразует исходный текст инструкции CREATE FUNCTION в скрытый формат. Выходные данные запутывания не видны непосредственно ни в одном представлении каталога. Пользователи, не имеющие доступа к системным таблицам или файлам баз данных, не смогут получить скрытый текст. Однако этот текст будет доступен привилегированным пользователям, которые либо смогут обращаться к системным таблицам через порт DAC, либо будут иметь непосредственный доступ к файлам баз данных. Кроме того, пользователи, имеющие право на подключение отладчика к серверному процессу, могут получить исходный текст процедуры из памяти во время выполнения. Дополнительные сведения о доступе к метаданным системы см. в статье Настройка видимости метаданных.
Использование этого параметра препятствует публикации данной функции как части репликации SQL Server. Этот параметр для функций CLR указывать нельзя.
SCHEMABINDING
Указывает, что функция привязана к объектам базы данных, которые содержат ссылки на нее. Если аргумент SCHEMABINDING указан, нельзя изменить базовые объекты таким способом, который может повлиять на определение функции. Сначала нужно изменить или удалить само определение функции, чтобы удалить зависимости от объекта, который требуется изменить.
Привязка функции к ссылающимся на нее объектам удаляется в следующих случаях:
- При удалении функции.
- При изменении функции инструкцией
ALTER
, если не указан параметрSCHEMABINDING
.
Функция может быть привязана к схеме только в том случае, если выполняются следующие условия.
- Функция является функцией Transact-SQL.
- Пользовательские функции и представления, на которые ссылается данная функция, также привязаны к схеме.
- Объекты, на которые ссылается функция, указываются двухкомпонентными именами.
- Функция и объекты, на которые она ссылается, относятся к одной и той же базе данных.
- Пользователь, выполняющий инструкцию
CREATE FUNCTION
, имеет разрешениеREFERENCES
на объекты базы данных, на которые ссылается функция.
RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
Указывает атрибут OnNULLCall скалярной функции. Если данный аргумент не указан, по умолчанию предполагается CALLED ON NULL INPUT. Это означает, что текст функции выполняется даже в том случае, если в качестве аргумента передано значение NULL.
Если атрибут RETURNS NULL ON NULL INPUT
указан для функции CLR, это означает, что SQL Server может вернуть NULL, не вызывая при этом тело функции в том случае, если в качестве какого-либо из аргументов указано значение NULL. Если метод функции CLR, указанный в <method_specifier>, уже имеет пользовательский атрибут, указывающий RETURNS NULL ON NULL INPUT, но инструкция CREATE FUNCTION указывает CALLED ON NULL INPUT, то приоритет имеет инструкция CREATE FUNCTION. Атрибут OnNULLCall не может быть указан для функций CLR с табличным значением.
EXECUTE AS
Указывает контекст безопасности, в котором выполняется определяемая пользователем функция. Иными словами, есть возможность управлять тем, какую учетную запись пользователя SQL Server использует при определении разрешений на объекты базы данных, на которые ссылается функция.
Примечание
EXECUTE AS
недопустимо указывать для встроенных функций с табличным значением.
Дополнительные сведения см. в разделе Предложение EXECUTE AS (Transact-SQL).
INLINE = { ON | OFF }
Применимо к: SQL Server (начиная с SQL Server 2019 (15.x)) и База данных SQL Azure.
Указывает, должна ли эта скалярная пользовательская функция быть встроенной. Это предложение применяется только к скалярным пользовательским функциям. Предложение INLINE
не является обязательным. Если предложение INLINE
не указано, оно автоматически принимает значение ON или OFF в зависимости от возможности встраивания пользовательской функции. Если INLINE = ON
указано, но функция не может быть встраиваемой, выдается ошибка. Дополнительные сведения: Встраивание скалярной функции, определяемой пользователем.
< column_definition >::=
Определяет тип данных таблицы. Декларация таблицы включает определения столбцов и ограничений. Для функций CLR можно указать только column_name и data_type.
column_name
Имя столбца в таблице. Имена столбцов должны соответствовать правилам для идентификаторов и быть уникальными в рамках таблицы. column_name может иметь длину от 1 до 128 символов.
data_type
Указывает тип данных столбца. Для функций Transact-SQL допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типа данных timestamp. Для функций CLR допустимы любые типы данных, включая определяемые пользователем типы данных CLR, кроме типов данных text, ntext, image, char, varchar, varchar(max) и timestamp. Нескалярный тип данных cursor не может указываться в качестве типа данных столбца ни для функций Transact-SQL, ни для функций CLR.
DEFAULT constant_expression
Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке. Выражение constant_expression является константой, значением NULL или значением системной функции. Определения DEFAULT могут применяться к любым столбцам, кроме тех, которые имеют свойство IDENTITY. Предложение DEFAULT не может быть указано для функций CLR с табличным значением.
COLLATE collation_name
Задает параметры сортировки для столбца. Если не указано, столбцу назначаются параметры сортировки, принятые в базе данных по умолчанию. Именем параметров сортировки может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL. Список и дополнительные сведения о параметрах сортировки см. в разделах Имя параметра сортировки Windows (Transact-SQL) и Имя параметра сортировки SQL Server (Transact-SQL).
Предложение COLLATE может быть использовано для изменения параметров сортировки только для столбцов с типом данных char, varchar, nchar или nvarchar.
Примечание
COLLATE
недопустимо указывать для функций с табличным значением в среде выполнения.
ROWGUIDCOL
Показывает, что новый столбец является строковым столбцом идентификаторов GUID. Только один столбец типа uniqueidentifier в таблице может быть назначен в качестве столбца ROWGUIDCOL. Свойство ROWGUIDCOL может быть присвоено только столбцу типа uniqueidentifier.
Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце. Кроме того, данное свойство не производит автоматическое формирование значений для новых строк, вставляемых в таблицу. Для создания уникальных значений произвольного столбца используйте функцию NEWID в инструкции INSERT. Может быть указано значение по умолчанию. При этом функция NEWID не может быть указана в качестве значения по умолчанию.
IDENTITY
Указывает, что новый столбец является столбцом идентификаторов. При добавлении в таблицу новой строки SQL Server формирует для столбца уникальное, последовательное значение. Столбцы идентификаторов обычно используются с ограничением PRIMARY KEY для поддержания уникальности идентификаторов строк в таблице. Свойство IDENTITY может назначаться для столбцов типа tinyint, smallint, int, bigint, decimal(p,0) или numeric(p,0) . Для каждой таблицы можно создать только один столбец идентификаторов. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указывать либо оба аргумента (и seed, и increment), либо не указывать ни одного из них. Если ничего не указано, применяется значение по умолчанию (1,1).
Предложение IDENTITY не может быть указано для функций CLR с табличным значением.
seed
Целочисленное значение, присваиваемое первой строке таблицы.
increment
Целочисленное значение, добавляемое к значению seed для каждой последующей строки таблицы.
< column_constraint >::= и < table_constraint>::=
Определяет ограничение для указанного столбца или таблицы. Для функций CLR единственное допустимое ограничение — NULL. Именованные ограничения недопустимы.
NULL | NOT NULL
Определяет, допустимы ли для столбца значения NULL. Параметр NULL не является ограничением в строгом смысле слова, но может быть указан так же, как и NOT NULL. Ограничение NOT NULL не может быть указано для функций CLR с табличным значением.
PRIMARY KEY
Ограничение, обеспечивающее целостность сущностей для указанного столбца через уникальный индекс. В возвращающих табличное значение пользовательских функциях ограничение PRIMARY KEY может быть создано только для одного столбца таблицы. Ограничение PRIMARY KEY не может быть указано для функций CLR с табличным значением.
UNIQUE
Ограничение, которое обеспечивает целостность сущностей для указанного столбца или столбцов с помощью уникального индекса. В таблице может быть несколько ограничений UNIQUE. Ограничение UNIQUE не может быть указано для функций CLR с табличным значением.
CLUSTERED | NONCLUSTERED
Указывает, что для ограничения PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный индекс. Ограничения PRIMARY KEY используют параметр CLUSTERED, а ограничения UNIQUE используют параметр NONCLUSTERED.
Параметр CLUSTERED может быть указан только для одного ограничения. Если параметр CLUSTERED указан для ограничения UNIQUE и указано ограничение PRIMARY KEY, то PRIMARY KEY использует NONCLUSTERED.
Параметры СLUSTERED и NONСLUSTERED не могут быть указаны для функций CLR с табличным значением.
CHECK
Ограничение, обеспечивающее целостность домена путем ограничения возможных значений, которые могут быть введены в столбец или столбцы. Ограничения CHECK не могут быть указаны для функций CLR с табличным значением.
logical_expression
Логическое выражение, возвращающее значения TRUE или FALSE.
<computed_column_definition>::=
Указывает вычисляемый столбец. Дополнительные сведения о вычисляемых столбцах см. в разделе CREATE TABLE (Transact-SQL).
column_name
Имя вычисляемого столбца.
computed_column_expression
Выражение, определяющее значение вычисляемого столбца.
<index_option>::=
Указывает параметры индекса для индекса PRIMARY KEY или UNIQUE. Дополнительные сведения о параметрах индекса см. в разделе CREATE INDEX (Transact-SQL).
PAD_INDEX = { ON | OFF }
Определяет разреженность индекса. Значение по умолчанию — OFF.
FILLFACTOR = fillfactor
Определяет величину в процентах, указывающую, насколько компонент Компонент Database Engine должен заполнять конечный уровень каждой страницы индекса во время создания или изменения индекса. Значение fillfactor должно быть целым числом от 1 до 100. Значение по умолчанию равно 0.
IGNORE_DUP_KEY = { ON | OFF }
Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный индекс повторяющиеся значения ключа. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса. Значение по умолчанию — OFF.
STATISTICS_NORECOMPUTE = { ON | OFF }
Указывает, выполнялся ли перерасчет статистики распределения. Значение по умолчанию — OFF.
ALLOW_ROW_LOCKS = { ON | OFF }
Указывает, разрешена ли блокировка строк. Значение по умолчанию — ON.
ALLOW_PAGE_LOCKS = { ON | OFF }
Указывает, разрешена ли блокировка страниц. Значение по умолчанию — ON.
Рекомендации
Если определяемая пользователем функция создана без применения предложения SCHEMABINDING
, то изменения базовых объектов могут повлиять на определение функции и привести к непредвиденным результатам при вызове функции. Рекомендуется реализовать один из следующих методов, чтобы обеспечить, что функция не устареет из-за изменения ее базовых объектов.
- Укажите при создании функции предложение
WITH SCHEMABINDING
. Это обеспечит невозможность изменения объектов, на которые ссылается определение функции, если при этом не изменяется сама функция. - Выполняйте хранимую процедуру sp_refreshsqlmodule после изменения любого объекта, указанного в определении функции.
Важно!
Дополнительные сведения и информацию о производительности в связи со встроенными функциями с табличным значением (встроенные TVF) или функциями с табличным значением из нескольких инструкций (MSTVF) см. в разделе Создание определяемых пользователем функций (ядро СУБД).
Типы данных
Если в функции CLR указаны параметры, они должны иметь тип данных SQL Server, как было ранее определено для scalar_parameter_data_type. Дополнительные сведения о сравнении системных типов данных SQL Server с типами данных интеграции со средой CLR и типами данных среды CLR платформы .NET Framework см. в разделе Сопоставление данных параметров CLR.
Чтобы SQL Server мог ссылаться на правильный метод при перегрузке в классе, метод, указанный в <method_specifier>, должен иметь следующие характеристики.
- Принимать то же число параметров, которое указано в [ ,…n ].
- Принимать все параметры по значению, а не по ссылке.
- Принимать типы параметров, совместимые с теми, что указаны в функции SQL Server.
Если в качестве возвращаемого значения функции CLR указан табличный тип (RETURNS TABLE), то возвращаемые данные метода в <method_specifier> должны иметь тип IEnumerator или Enumerable и подразумевается, что этот интерфейс реализуется автором функции. В отличие от функций Transact-SQL функции CLR не могут содержать ограничения PRIMARY KEY, UNIQUE и CHECK в <table_type_definition>. Типы данных столбцов, указанные в <table_type_definition>, должны совпадать с типами данных соответствующих столбцов результирующего набора, возвращаемого методом в <method_specifier> во время выполнения. Проверка типов на этапе создания функции не производится.
Дополнительные сведения о программировании функций CLR см. в разделе Определяемые пользователем функции среды CLR.
Скалярная функция может быть указана в любом месте вместо скалярного выражения, в том числе в вычисляемых столбцах и определениях ограничений CHECK. Кроме того, скалярная функция может быть выполнена инструкцией EXECUTE. Скалярные функции должны вызываться с помощью как минимум двухкомпонентного имени ( <schema>.<function> ). Дополнительные сведения о многокомпонентных именах см. в разделе Соглашения о синтаксисе в Transact-SQL (Transact-SQL). Функция, возвращающая табличное значение, может быть вызвана в любом месте, где допускаются табличные выражения, — в предложении FROM
ROM инструкций SELECT
, INSERT
, UPDATE
или DELETE
. Дополнительные сведения см. в разделе Выполнение определяемых пользователем функций.
Совместимость
В функциях допустимы следующие инструкции.
- Инструкции присваивания.
- Инструкции управления потоком, за исключением инструкций
TRY...CATCH
. - Инструкции
DECLARE
, объявляющие локальные переменные и локальные курсоры. - Инструкции
SELECT
, которые содержат списки выбора с выражениями, присваивающими значения локальным переменным. - Операции над локальными курсорами, которые объявляются, открываются, закрываются и освобождаются в теле функции. Допустимы только те инструкции
FETCH
, которые предложениемINTO
присваивают значения локальным переменным. ИнструкцииFETCH
, возвращающие данные клиенту, недопустимы. - Инструкции
INSERT
,UPDATE
иDELETE
, которые изменяют локальные табличные переменные. - Инструкции
EXECUTE
, вызывающие расширенные хранимые процедуры.
Дополнительные сведения см. в разделе Создание определяемых пользователем функций (ядро СУБД).
Взаимодействие с вычисляемыми столбцами
Функции имеют перечисленные ниже свойства. Значения этих свойств определяют, может ли данная функция быть указана в вычисляемых столбцах, которые могут быть материализованными или индексированными.
Свойство | Описание | Примечания |
---|---|---|
IsDeterministic | Функция детерминированная или недетерминированная. | Для детерминированных функций разрешается доступ к локальным данным. Например, функция, которая при вызове с одними и теми же параметрами и в одном том же состоянии базы данных всегда возвращает один и тот же результат, называется детерминированной. |
IsPrecise | Функция точная или неточная. | Неточные функции содержат такие операции, как операции с плавающей запятой. |
IsSystemVerified | SQL Server может проверять свойства точности и детерминированности функций. | |
SystemDataAccess | Функции, производящие доступ к системным данным (системным каталогам или виртуальным системным таблицам) в локальном экземпляре SQL Server. | |
UserDataAccess | Функция производит доступ к данным пользователя в локальном экземпляре SQL Server. | Сюда входят определяемые пользователем и временные таблицы, но не табличные переменные. |
Для функций Transact-SQL свойства точности и детерминизма SQL Server определяет автоматически. Свойства доступа к данным и детерминированности функций CLR могут быть указаны пользователем. Дополнительные сведения см. в разделе Общие сведения о пользовательских атрибутах интеграции со средой CLR.
Для отображения текущих значений этих свойств используйте функцию OBJECTPROPERTYEX.
Важно!
Функции необходимо создавать с детерминированным SCHEMABINDING
.
Вычисляемый столбец, который обращается к определяемой пользователем функции, может быть включен в индекс, если функция имеет следующие значения свойств:
- IsDeterministic = true
- IsSystemVerified = true (если вычисляемый столбец не является сохраняемым)
- UserDataAccess = false
- SystemDataAccess = false
Дополнительные сведения см. в разделе Индексы вычисляемых столбцов.
Вызов расширенной хранимой процедуры из функций
Расширенные хранимые процедуры, если они вызываются из тела функции, не могут возвращать клиенту результирующие наборы. Все API ODS, которые возвращают результирующие наборы клиенту, вернут FAIL. Расширенная хранимая процедура может подключаться к экземпляру SQL Server, но она не должна пытаться присоединиться к той же транзакции, что и функция, из которой вызвана расширенная хранимая процедура.
Как и при вызове из пакета или хранимой процедуры, расширенная хранимая процедура будет выполняться в контексте учетной записи системы безопасности Windows, от имени которой выполняется SQL Server. Владелец хранимой процедуры должен это понимать, когда он предоставляет пользователям разрешение EXECUTE на нее.
Ограничения
Определяемые пользователем функции не могут выполнять действия, изменяющие состояние базы данных.
Определяемые пользователем функции не могут содержать предложение OUTPUT INTO
, целью которого является таблица.
Следующие инструкции компонента Компонент Service Broker не могут быть включены в определение определяемой пользователем функции Transact-SQL:
BEGIN DIALOG CONVERSATION
END CONVERSATION
GET CONVERSATION GROUP
MOVE CONVERSATION
RECEIVE
SEND
Определяемые пользователем функции могут быть вложенными, то есть из одной функции может быть вызвана другая. Уровень вложенности увеличивается на единицу каждый раз, когда начинается выполнение вызванной функции и уменьшается на единицу, когда ее выполнение завершается. Вложенность определяемых пользователем функций не может превышать 32 уровней. Превышение максимального уровня вложенности приводит к ошибке выполнения для всей цепочки вызываемых функций. Каждый вызов управляемого кода из определяемой пользователем функции Transact-SQL считается за один уровень вложенности из 32 возможных. Методы, вызываемые из управляемого кода, под это ограничение не подпадают.
Использование порядка сортировки в функциях CLR с табличным значением
При использовании предложения ORDER
в функциях CLR с табличным значением придерживайтесь следующих рекомендаций.
-
Необходимо гарантировать, чтобы результаты всегда были упорядочены в указанном порядке. Если результаты находятся не в указанном порядке, при выполнении запроса SQL Server сформирует сообщение об ошибке.
-
Если указано предложение
ORDER
, выходные данные функции с табличным значением должны быть отсортированы в соответствии с параметрами сортировки столбца (явными или неявными). Например, если для столбца используются параметры сортировки для китайского языка (указанные в определении функции с табличным значением или полученные из параметров сортировки базы данных), то возвращаемые результаты должны быть отсортированы в соответствии с правилами сортировки, принятыми в китайском языке. -
При использовании предложение
ORDER
всегда проверяется SQL Server при возврате результатов, независимо от его использования обработчиком запросов для выполнения оптимизации. Рекомендуется использовать предложениеORDER
только при уверенности в его пользе для обработчика запросов. -
Обработчик запросов SQL Server автоматически использует преимущества предложения
ORDER
в следующих случаях.- Запросы Insert, в которых предложение
ORDER
совместимо с индексом. - Предложения
ORDER BY
, совместимые с предложениемORDER
. - Статистические выражения, где
GROUP BY
совместим с предложениемORDER
. - Статистические выражения с ключевым словом
DISTINCT
, в которых уникальные столбцы совместимы с предложениемORDER
.
- Запросы Insert, в которых предложение
Предложение ORDER
не гарантирует упорядочивания результатов при выполнении запроса SELECT, если ORDER BY
не указано в самом запросе. Сведения о запросе столбцов, включенных в порядок сортировки для функций с табличным значением, см. в разделе sys.function_order_columns (Transact-SQL).
В следующей таблице приводятся системные представления каталога, возвращающие метаданные об определяемых пользователем функциях.
Разрешения
Требуется разрешение CREATE FUNCTION
на базу данных и разрешение ALTER
для схемы, в которой создается функция. Если в функции указан определяемый пользователем тип, требуется разрешение EXECUTE
на этот тип.
Примеры
A. Применение скалярной определяемой пользователем функции, вычисляющей неделю по ISO
В следующем примере показано создание определяемой пользовательской функции ISOweek
, которая получает в качестве аргумента дату и вычисляет номер недели по ISO. Для правильной работы этой функции перед ее вызовом должна быть выполнена инструкция SET DATEFIRST 1
.
Следующий пример также показывает использование предложения EXECUTE AS для указания контекста безопасности, в котором может быть выполнена хранимая процедура. В этом примере параметр CALLER
указывает, что процедура будет выполнена в контексте пользователя, который ее вызывает. Также могут быть указаны параметры SELF
, OWNER
и user_name.
Показан вызов функции. Обратите внимание, что DATEFIRST
устанавливается в значение 1
.
CREATE FUNCTION dbo.ISOweek (@DATE datetime)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ISOweek int;
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104');
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1;
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1;
RETURN(@ISOweek);
END;
GO
SET DATEFIRST 1;
SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';
Результирующий набор:
ISO Week
----------------
52
Б. Создание встроенной функции с табличным значением
Результатом следующего примера является встроенная функция, возвращающая табличное значение в базу данных AdventureWorks2012. Для каждого из товаров, проданных в магазине, она возвращает три столбца: ProductID
, Name
и статистику с начала года по магазину — YTD Total
.
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
GO
При вызове этой функции выполняется следующий запрос.
SELECT * FROM Sales.ufn_SalesByStore (602);
В. Создание функции с табличным значением из нескольких инструкций
В следующем примере создается функция с табличным значением fn_FindReports(InEmpID)
в базе данных AdventureWorks2012. Если ей передать допустимый идентификатор сотрудника, она вернет таблицу, в которой содержатся все сотрудники, которые прямо или опосредованно перед ним отчитываются. В функции для построения иерархического списка сотрудников используется рекурсивное обобщенное табличное выражение (CTE). Дополнительные сведения о рекурсивных обобщенных табличных выражениях см. в разделе WITH common_table_expression (Transact-SQL).
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
EmployeeID int primary key NOT NULL,
FirstName nvarchar(255) NOT NULL,
LastName nvarchar(255) NOT NULL,
JobTitle nvarchar(50) NOT NULL,
RecursionLevel int NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns
AS (
-- Get the initial list of Employees for Manager n
SELECT e.BusinessEntityID, OrganizationNode = ISNULL(e.OrganizationNode, CAST('/' AS hierarchyid))
, p.FirstName, p.LastName, e.JobTitle, 0
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @InEmpID
UNION ALL
-- Join recursive member to anchor
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1
FROM HumanResources.Employee e
INNER JOIN EMP_cte
ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
)
-- copy the required columns to the result of the function
INSERT @retFindReports
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM EMP_cte
RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM dbo.ufn_FindReports(1);
GO
Г. Создание функции CLR
В следующем примере создается функция CLR len_s
. Перед ее созданием сборка SurrogateStringFunction.dll
регистрируется в локальной базе данных.
Область применения: SQL Server (SQL Server 2008 с пакетом обновления 1 (SP1) и выше)
DECLARE @SamplesPath nvarchar(1024);
-- You may have to modify the value of this variable if you have
-- installed the sample in a location other than the default location.
SELECT @SamplesPath = REPLACE
( physical_name
, 'Microsoft SQL ServerMSSQL13.MSSQLSERVERMSSQLDATAmaster.mdf'
, 'Microsoft SQL Server130SamplesEngineProgrammabilityCLR'
)
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY [SurrogateStringFunction]
FROM @SamplesPath + 'StringManipulateCSStringManipulatebindebugSurrogateStringFunction.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO
CREATE FUNCTION [dbo].[len_s] (@str nvarchar(4000))
RETURNS bigint
AS EXTERNAL NAME [SurrogateStringFunction].[Microsoft.Samples.SqlServer.SurrogateStringFunction].[LenS];
GO
Пример создания функции CLR с табличным значением см. в разделе Функции среды CLR с табличным значением.
Д. Отображение определения определяемых пользователем функций
SELECT definition, type
FROM sys.sql_modules AS m
JOIN sys.objects AS o ON m.object_id = o.object_id
AND type IN ('FN', 'IF', 'TF');
GO
Определения зашифрованных функций, созданных с помощью параметра ENCRYPTION
, в sys.sql_modules не отображаются, но все остальные сведения о них доступны.
См. также:
- Создание определяемых пользователем функций (компонент Database Engine)
- ALTER FUNCTION (Transact-SQL)
- DROP FUNCTION (Transact-SQL)
- OBJECTPROPERTYEX (Transact-SQL)
- sys.sql_modules (Transact-SQL)
- sys.assembly_modules (Transact-SQL)
- EXECUTE (Transact-SQL)
- Определяемые пользователем функции среды CLR
- EVENTDATA (Transact-SQL)
- CREATE SECURITY POLICY (Transact-SQL)