2013-03-25 2 views
2

Я имею следующую хранимую процедуру:Неверное исключение литых?

Create PROCEDURE [dbo].[GETVendorsStatsAgainstSearTerm] 
    @Date DateTime , 
    @SearchId bigint 
AS 

declare @cmd as varchar(2000) 
set @cmd = ' select *, ' + cast(SearchId as varchar) + ' as SearhId from tbl' 
exec (@cmd) 

Я хочу, чтобы рассматривать SearchId в качестве колонки для запуска выберите запрос против. Я хочу знать правильный тип для столбца SearchId.

Я не могу преобразовать этот столбец SearchId в длинный тип данных в C#. Кто-нибудь может мне помочь?

+5

'бросок (SearchId как VARCHAR (50))' - добавить длину на VARCHAR или иначе он будет преобразован в 'VARCHAR (1)'. –

+0

@JW Не точно, в функциях CAST и CONVERT по умолчанию используется VARCHAR (30), а не 1, см. Здесь: http://msdn.microsoft.com/en-us/library/ms176089.aspx – CloudyMarble

+0

@TwoMore: Может или может не назначать желаемую длину, которую вы ожидаете. Это может «усечь» значение. Проверьте эту статью от Aaron http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx – praveen

ответ

0

Вы можете попробовать с Convert function

Convert(varchar(50),SearchId) 
0

Я думаю, проблема в том, что есть некоторые Unassigned SearchId, который вызывает csating нуль в VARCHAR.

Попробуйте что-то вроде этого:

//... 
set @cmd = CASE 
    WHEN (SearchId IS NOT NULL) THEN (' select *, ' + cast(SearchId as varchar) + ' as SearhId from tbl') 
    ELSE ' select *, 0 as SearhId from tbl' 
END 
///... 
+0

как вы можете это объяснить? http://www.sqlfiddle.com/#!6/d41d8/3240 в основном сервер, который я использовал, это 'SQL Server 2012'. –

Смежные вопросы