0

このコードを実行するとエラーが発生し、何が問題なのかわかりません

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
4

2 に答える 2

0

@cfield が varchar として宣言されているようです。数値が含まれている場合はbigintに変換できますが、文字値が含まれている場合はbigintに変換できません。

于 2013-10-21T07:01:36.763 に答える
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
于 2015-06-01T07:23:37.647 に答える