Почему Sql не возвращает результаты, если я не установил размер varchar?
У меня есть сценарий SQL, который выбирает результаты на основе переданного ему цвета, но если я не установлю размер переменной, определенной как varchar (50), результаты не будут возвращены.
Если я использую: like ''+@Colour+'%'
тогда это работает, но я действительно не хочу использовать это в случае, если это возвращает результаты, которые мне не нужны или не нужны.
Столбец FieldValue имеет тип Varchar(Max) (который нельзя изменить, поскольку в этом поле могут храниться разные вещи). Он является частью пакета aspdotnetstorefront, поэтому я не могу изменить таблицы или типы полей.
Это не работает:
declare @Col VarChar
set @Col = 'blu'
select * from dbo.MetaData as MD where MD.FieldValue = @Colour
Но это работает:
declare @Col VarChar (50)
set @Col = 'blu'
select * from dbo.MetaData as MD where MD.FieldValue = @Colour
Код используется в следующем контексте, но должен работать в любом случае
<query name="Products" rowElementName="Variant">
<sql>
<![CDATA[
select * from dbo.MetaData as MD where MD.Colour = @Colour
]]>
</sql>
<queryparam paramname="@ProductID" paramtype="runtime" requestparamname="pID" sqlDataType="int" defvalue="0" validationpattern="^\d{1,10}$" />
<queryparam paramname="@Colour" paramtype="runtime" requestparamname="pCol" sqlDataType="varchar" defvalue="" validationpattern=""/>
</query>
Есть идеи?
Также я не могу установить размер в <queryparam paramname="@Colour" paramtype="runtime" requestparamname="pCol" sqlDataType="varchar" defvalue="" validationpattern=""/>
3 ответа
varchar
объявление даст вам 1 символ по умолчанию, если вы не укажете иначе.
Это потому, что вы объявляете @Col как varchar. Это то же самое, что и к правому varchar(1).
Если n не указано в определении данных или в объявлении переменной, длина по умолчанию равна 1. Когда n не указана с помощью функции CAST, длина по умолчанию равна 30.
Цитата отсюда
http://msdn.microsoft.com/en-us/library/aa258242(SQL.80).aspx
ОБНОВИТЬ
Зачем вам нужно динамически указывать размер varchar? Просто установите его на максимально возможную длину.
Declare @Col varchar
по существу Declare @Col varchar(1)
поэтому, когда вы назначаете значение, результат будет @col
равно "б".
Такое поведение разработано и описано в MSDN