Использование кода, аналогичного приведенному ниже, в более крупной хранимой процедуре:
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 в конец найденного значения. Таким образом, это тоже не вариант.
Как сохранить форматирование, используемое в базе данных, при сохранении выбранного значения в переменной - учитывая, что значение, найденное в базе данных , может быть или не быть числовым ?
Однако, когда найдены десятичные дроби