Nano Hash - криптовалюты, майнинг, программирование

Создайте параметризованное представление в SQL Server 2008.

Можем ли мы создать параметризованный VIEW в SQL Server 2008.

Или любая другая альтернатива для этого?

21.12.2010

Ответы:


1

Попробуйте создать встроенную функцию с табличным значением. Пример:

CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS TABLE
AS
RETURN
(
    SELECT Field1, Field2
    FROM SomeTable
    WHERE Field3 = @Parameter1
)

-- Then call like this, just as if it's a table/view just with a parameter
SELECT * FROM dbo.fxnExample(1)

Если вы просмотрите план выполнения для SELECT, вы вообще не увидите упоминания об этой функции и фактически просто покажете вам запрашиваемые базовые таблицы. Это хорошо, поскольку означает, что статистика по базовым таблицам будет использоваться при создании плана выполнения запроса.

Чего следует избегать, так это функции с табличным значением, состоящей из нескольких операторов, поскольку базовая статистика таблицы не будет использоваться и может привести к снижению производительности из-за плохого плана выполнения.
Пример того, чего следует избегать :

CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
    RETURNS @Results TABLE(Field1 VARCHAR(10), Field2 VARCHAR(10))
AS
BEGIN
    INSERT @Results
    SELECT Field1, Field2
    FROM SomeTable
    WHERE Field3 = @Parameter1

    RETURN
END

Немного отличается, но с потенциально большими различиями в производительности, когда функция используется в запросе.

21.12.2010
  • Это был полезный ответ для меня. Спасибо АдаДев! 08.03.2012
  • Существует проблема, если вам нужно сделать вызов между связанными серверами, функции с табличным значением не разрешены. 18.04.2012
  • Пример того, чего следует избегать, очень и очень важен. Я только что внес одно изменение, чтобы моя функция соответствовала первому примеру (удалив ее от того, чего следует избегать), и я получил огромное улучшение производительности. 17.07.2012
  • Собирается ли UNION в хорошем примере переместить его, чтобы избежать категории? 15.08.2014

  • 2

    Нет, ты не можешь. Но вы можете создать определяемую пользователем табличную функцию.

    21.12.2010

    3

    на самом деле существует одна хитрость:

    create view view_test as
    
    select
      * 
    from 
      table 
    where id = (select convert(int, convert(binary(4), context_info)) from master.dbo.sysprocesses
    where
    spid = @@spid)
    

    ... в sql-запросе:

    set context_info 2
    select * from view_test
    

    будет то же самое с

    select * from table where id = 2
    

    но использование udf более приемлемо

    21.12.2010
  • Я бы серьезно плакала, много-много плача, полные ведра. Бессонные ночи... 21.12.2010
  • Без неуважения, но это хороший пример разницы между тем, что вы можете сделать, и тем, что вы должны (или не должны) делать. 21.12.2010
  • я не настаиваю на этом решении. и я никогда не использовал его в mssql сам. я только что упомянул, что это возможно теоретически 21.12.2010
  • Проголосовал за интересный хак. Не то чтобы это нужно было использовать. 18.07.2018

  • 4

    Как уже упоминал Астандер, вы можете сделать это с помощью UDF. Однако для больших наборов, использующих скалярную функцию (в отличие от встроенной табличной функции), производительность будет падать, поскольку функция вычисляется построчно. В качестве альтернативы вы можете предоставить те же результаты через хранимую процедуру, выполняющую фиксированный запрос с заполнителями, которые заменяют значения ваших параметров.

    (Вот несколько устаревшая, но все еще актуальная статья о построчной обработке скалярных пользовательских функций.)

    Изменить: комментарии относительно. ухудшение производительности скорректировано, чтобы было ясно, что это относится к скалярным пользовательским функциям.

    21.12.2010
  • Если вы пишете UDF как встроенную функцию, возвращающую табличное значение, нет никаких причин, по которым производительность должна быть плохой. Если вы говорите о скалярных функциях, то да, функция будет оцениваться для каждой строки. 21.12.2010
  • извините за оплошность - вы совершенно правы. Я отредактирую свой ответ, чтобы прояснить это. 21.12.2010

  • 5

    нет. Вы можете использовать UDF, в котором вы можете передавать параметры.

    21.12.2010
  • Вы читали какие-либо другие ответы? Может об этом уже упоминалось? 21.12.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..