将数据类型varchar转换为bigint SQL时出错

将数据类型varchar转换为bigint SQL时出错,sql,sql-server,Sql,Sql Server,当我运行这段代码时,它会给我一个错误,我不知道这是怎么回事 DECLARE @COUNTER BIGINT DECLARE @SQL varchar (800) DECLARE @SQL2 nvarchar(max) = N'SELECT @Counter = MIN(CAST('+@cfield+' AS BIGINT)) FROM '+@ctable+' WHERE dbo.IsInteger('+@cfield+') = 1 and '+@cdatefield+' >='''

当我运行这段代码时,它会给我一个错误,我不知道这是怎么回事

DECLARE @COUNTER BIGINT
DECLARE @SQL  varchar (800)

DECLARE @SQL2 nvarchar(max) = N'SELECT @Counter =  MIN(CAST('+@cfield+' AS BIGINT)) FROM '+@ctable+' WHERE  dbo.IsInteger('+@cfield+') = 1 and '+@cdatefield+' >=''' +@ddatefrm+''' and '+@cdatefield+' <= '''+@ddateto+''''

PRINT @SQL2

-- EXEC @SQL
EXEC sp_executesql @SQL2, N'@Counter BIGINT OUTPUT', @Counter = @Counter OUTPUT

PRINT @Counter
DECLARE@COUNTER-BIGINT
声明@SQL varchar(800)

声明@SQL2 nvarchar(max)=N'SELECT@Counter=MIN(CAST(+@cfield+'AS BIGINT))从“++@ctable++”中选择,其中dbo.IsInteger(+@cfield+')=1和“++@cdatefield+>=”++@ddatefrm++”和“++@cdatefield+”看起来@cfield被声明为varchar。它包含数值,可以转换为bigint。但是如果contais字符值不能转换为bigint。

您必须确保没有在任何数值列后面附加字符串

DECLARE @COUNTER BIGINT;
DECLARE @SQL VARCHAR( 800 );
DECLARE @SQL2 NVARCHAR( MAX ) = N'SELECT @Counter =  MIN(CAST(' 
                    + CAST(@cfield as varchar(100))+ ' AS BIGINT)) FROM ' 
                    + CAST(@ctable AS varchar(100))
                    + ' WHERE  dbo.IsInteger(' + CAST(@cfield as varchar(100)) 
                    + ') = 1 and ' + cast(@cdatefield  as varchar(100))
                    + ' >=''' + cast(@ddatefrm as varchar(100))+ ''' and ' 
                    + cast(@cdatefield  as varchar(100))
                    + ' <= ''' + cast(@ddateto as varchar(100)) + '''';
PRINT @SQL2;

-- EXEC @SQL
EXEC sp_executesql
     @SQL2,
     N'@Counter BIGINT OUTPUT',
     @Counter = @Counter OUTPUT;
PRINT @Counter;
DECLARE@COUNTER-BIGINT;
声明@sqlvarchar(800);
声明@SQL2 NVARCHAR(MAX)=N'SELECT@Counter=MIN(CAST
+将(@cfield作为varchar(100))+“作为BIGINT”)从
+铸造(@ctable为varchar(100))
+'其中dbo.IsInteger('+CAST(@cfield as varchar(100))
+')=1和'+cast(@cdatefield作为varchar(100))
+'>=''''+cast(@ddatefrm as varchar(100))+''和'
+强制转换(@cdatefield为varchar(100))
+ ' ='''
“、@ddatefrm”、“和”

“@cdatefield,”你的问题被含糊不清地提到。当您声明@field时,类型是什么?是否
@cfield
包含一些无法转换为
bigint
的值?另外,当使用
PRINT@SQL2
打印时,查询是什么样子的?@cfield是varchar。。。ddatefrm和ddateto是varchar
DECLARE @COUNTER BIGINT
DECLARE @SQL  varchar (800)

DECLARE @SQL2 nvarchar(max) = concat(N'SELECT @Counter =  MIN(CAST('
                          ,@cfield,' AS BIGINT)) FROM ',@ctable,' WHERE  dbo.IsInteger('
                          ,@cfield+') = 1 and ',@cdatefield,' >='''
                          ,@ddatefrm,''' and '
                          ,@cdatefield,' <= ''',@ddateto,'''')

PRINT @SQL2

-- EXEC @SQL
EXEC sp_executesql @SQL2, N'@Counter BIGINT OUTPUT', @Counter = @Counter OUTPUT

PRINT @Counter