Выбор значения из таблицы в переменную без изменения форматирования? - PullRequest
0 голосов
/ 30 октября 2018

Использование кода, аналогичного приведенному ниже, в более крупной хранимой процедуре:

DECLARE @Foo NVARCHAR(500)
SET @Foo = (SELECT [MyColumn] FROM [MyTable] WHERE ID = 1)    -- May be numeric or text
SELECT * FROM [MyTable] WHERE [MyColumn] = @Foo

Теоретически приведенный выше код всегда должен возвращать то же, что и запрос

SELECT * FROM [MyTable] WHERE ID = 1

Однако часто возвращается (0 Rows). Причина этого в том, что переменная @Foo не всегда хранит найденное значение в том же формате, что и таблица.

Например, таблица может содержать значение 2152437. Однако приведенный выше оператор select может привести к тому, что он будет сохранен как @Foo = 2.01512e+007.

Я попытался решить эту проблему с помощью кода

IF ISNUMERIC((SELECT [MyColumn] FROM [MyTable] WHERE ID = 1)) = 1 SET @Foo = Str((SELECT [MyColumn] FROM [MyTable] WHERE ID = 1))
ELSE SET @Foo = (SELECT [MyColumn] FROM [MyTable] WHERE ID = 1)

Проблема в том, что, хотя он позволяет хранить большие числа в @Foo в том же формате, в котором они находятся в базе данных, он приводит к округлению десятичных дробей. Я также пытался использовать код

SET @Foo = Str((SELECT [MyColumn] FROM [MyTable] WHERE ID = 1), 10, 6)

Однако это добавляет нежелательные 0 в конец найденного значения. Таким образом, это тоже не вариант.

Как сохранить форматирование, используемое в базе данных, при сохранении выбранного значения в переменной - учитывая, что значение, найденное в базе данных , может быть или не быть числовым ?

Однако, когда найдены десятичные дроби

1 Ответ

0 голосов
/ 30 октября 2018

Это не точное решение, но вы можете попробовать:

SELECT *
FROM [MyTable]
WHERE CAST([MyColumn] as NVARCHAR(500)) = @Foo;

Однако я действительно задаюсь вопросом, что вы пытаетесь сделать. Почему вы сохраняете числовое значение в переменной?

Во-вторых, проблема, которую вы получаете, заключается в том, что столбец хранится с использованием представления с плавающей запятой. Ваш код будет работать так, как вы собираетесь, если вы переключитесь на представление с фиксированной запятой (numeric / decimal). Это может быть самое простое решение этой проблемы.

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