2013-10-21 108 views
0

当我运行这段代码它给我的错误,我没有什么不对的错误转换数据类型为varchar为bigint SQL错误

DECLARE @COUNTER BIGINT 
DECLARE @SQL varchar (800) 

DECLARE @SQL2 nvarchar(max) = N'SELECT @Counter = MIN(CAST('[email protected]+' AS BIGINT)) FROM '[email protected]+' WHERE dbo.IsInteger('[email protected]+') = 1 and '[email protected]+' >=''' [email protected]+''' and '[email protected]+' <= '''[email protected]+'''' 

PRINT @SQL2 

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

PRINT @Counter 
+1

你的问题提到不清楚。你是否声明@fieldand是什么类型的? –

+1

'@ cfield'是否包含一些无法转换为'bigint'的值?另外,当使用'PRINT @ SQL2'打印时,查询的效果如何? – jpw

+0

@cfield is varchar ... and ddatefrm and ddateto is varchar –

回答

0

它看起来像@cfield被声明为varchar。它包含的数值可以转换为bigint,但如果contais字符值不能转换为bigint。

0

你必须确保你没有附加任何带有字符串的数字列。

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; 

对于上面的SQL Server 2012 &,您可以试试这个。

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 
相关问题