Как я могу наблюдать эффект от отключения SET CONCAT_NULL_YIELDS_NULL? - PullRequest
2 голосов
/ 02 апреля 2019

У нас есть старый продукт базы данных;основное развертывание всегда выполнялось ALTER Database [databasename] SET CONCAT_NULL_YIELDS_NULL OFF.Поскольку этот параметр исчезает, мы хотим разработать план тестирования, чтобы избавиться от него и отследить, какой код от него зависит.

При этом выключении документация говорит, что SELECT 'abc' + NULL FROM sometable приводит кabc, а не NULL.

Я могу легко наблюдать это поведение на уровне соединения;однако приложение никогда не устанавливает его на уровне соединения.Вопрос не в этом.

Как можно с помощью любого оператора SQL наблюдать эффект отключения CONCAT_NULL_YIELDS_NULL только на уровне базы данных с использованием .NET System.Data.SqlClient в качестве клиента доступа к базе данных?

Мы проверили всю кодовую базу и удалили все экземпляры команд SET, за исключением уровня изоляции транзакции, поскольку эти вещи довольно сложны.Хотя я попытался EXEC проверить, сможет ли он обойти настройки драйвера, и обнаружил, что это не так, я вполне уверен, что существует довольно экзотическая конструкция SQL, которая может быть успешной.

Ответы [ 3 ]

1 голос
/ 06 апреля 2019

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

Существует строгая иерархия в настройке параметров:

  1. Настройки всего экземпляра для всех баз данных, используя sp_configure 'user options'. Самый низкий уровень по умолчанию.
  2. Опции для базы данных, которые можно установить с помощью ALTER DATABASE. Приоритет над экземплярами по умолчанию.
  3. Явные SET операторы, выполняемые для соединения. Переопределить все.

Совет? Измените строку подключения приложения, если вы можете, чтобы оно использовало другой драйвер, который не устанавливает / не трогает эту опцию. Предполагая, конечно, что это ничего не сломает, но это вещь, которая может быть проверена относительно быстро.

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


P.S. Для полноты информации единственные известные мне взаимозависимые варианты перечислены ниже:

  1. Настройки ярлыков, например ANSI_DEFAULTS. Его настройка фактически влияет на несколько параметров, связанных с совместимостью с ANSI;
  2. SET LANGUAGE. При изменении языка соединения он также переопределяет параметры DATEFIRST и DATEFORMAT.

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

0 голосов
/ 04 апреля 2019

Этого можно достичь с помощью этого запроса

IF (SELECT ''+NULL) IS NULL
BEGIN
    SET CONCAT_NULL_YIELDS_NULL OFF
END
ELSE
BEGIN
    SET CONCAT_NULL_YIELDS_NULL ON
END
0 голосов
/ 02 апреля 2019

Даже если ваше приложение не указывает эту опцию явно, разные драйверы ODBC и OLEDB имеют разные значения по умолчанию для параметров подключения.В зависимости от драйвера, этот конкретный параметр может быть задан неявно или наследоваться от настроек базы данных / сервера.

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

Что касается переопределения поведения драйвера, задав этот параметр, то довольно подробный ответ для аналогичного вопроса на DBAStackExchange.Там вы можете найти несколько возможных подходов и посмотреть, какой из них подходит вам лучше всего.

На стороне SQL одним из возможных решений является замена конкатенации строк + старого стиля новой функцией concat(), котораядоступно с SQL Server 2012. Эта функция пропускает аргументы NULL во время конкатенации, поэтому результат всегда выглядит так, как будто для concat_null_yields_null установлено значение off.В зависимости от количества модулей кода SQL в вашей системе, это может быть довольно сложным делом, тем более что трудно различить числовые добавления и конкатенации строк невооруженным глазом.

Я бы порекомендовал присмотреться к некоторыминструменты анализа / рефакторинга кода, которые могут помочь в этом.Не уверен, есть ли у SSDT такая возможность, но я бы сначала начал с нее, поскольку она бесплатна (и, возможно, имеет смысл попробовать Visual Studio 2019, выпущенную 2 дня назад - там что-то может быть).Кроме этого, хорошо ... RedGate, Idera, ApexSQL, вы называете это.Возможно, кто-то уже сделал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...