2016-11-22 12 views
0

に宣言された変数を置くことができない。 B.FIDCategoryを選択 nvarchar型の値を変換する際は、私は私のSPでこのコードを持ってsp_executesqlを

は、」変換に失敗しました:

ALTER PROCEDURE [dbo].[API_LIST_CONTENT_TEST] 
@Page int, 
@PageSize int = 20, 
@TotalPage int Output 
AS 
BEGIN 
SET NOCOUNT ON 

-- PAGING -- 
DECLARE @FirstPage INT, @LastPage INT, @TotalRecord MONEY 
SELECT @FirstPage = (@Page - 1) * @PageSize, 
     @LastPage = (@Page * @PageSize) + 1, 
     @TotalPage = 0, 
     @TotalRecord = 0 

-- DATA -- 
CREATE TABLE #Data(
    ID INT IDENTITY(1,1) NOT NULL, 
    Distance INT 
) 

DECLARE @TodayOpen nvarchar(100), @TodayClose nvarchar(100), @SQLSELECT NVARCHAR(MAX) 
SELECT @TodayOpen = DATENAME(dw,GETDATE())+'Open', @TodayClose = DATENAME(dw,GETDATE())+'Close', @SQLSELECT = '' 

SELECT @TotalRecord = COUNT(1) FROM #Data 
SELECT @TotalPage = CASE WHEN @TotalRecord = 0 THEN 0 ELSE CEILING(@TotalRecord/@PageSize) END 

SELECT @SQLSELECT = N' 
SELECT 
    B.[Address], 
    B.'+ @todayOpen +', 
    B.'+ @todayClose +' 
FROM #Data D 
    INNER JOIN dbo.Bis B WITH (NOLOCK) ON D.BizID = B.BizID 
    LEFT JOIN dbo.Category C WITH (NOLOCK) ON B.FIDCategory = C.CategoryID 
WHERE B.[Status] = 3 AND ID > '+ @FirstPage +' 
ORDER BY ID' 

EXEC (@SQLSELECT) 

DROP TABLE #Data 

END 

それは例外となり、...... .... .... B. [ステータス] = 3 AND ID> '

データタイプintへの @FirstPageはSQLSELECTで読み取ることができません。なぜですか?

私はFirst Grad Programmerですので、助けてください。

+0

'WHERE B. [状態] = 3とID>「+キャスト(@FirstPage as nvarchar)+ ' –

+0

uは' + Convert(Varchar、@ FirstPage)+ 'のように@FirstPage変数を提供することがあります –

+0

ありがとう!!!!!!!!!! – Richard

答えて

1

あなたはvarcharあるので、それでINT値を設定することを可能にされていない@SQLSELECT変数に動的なクエリと設定文字列値を作成しているとして、int型からVarchar@FirstPage変数を変換する必要があります。

あなた

ALTER PROCEDURE [dbo].[API_LIST_CONTENT_TEST] 
@Page int, 
@PageSize int = 20, 
@TotalPage int Output 
AS 
BEGIN 
SET NOCOUNT ON 

-- PAGING -- 
DECLARE @FirstPage INT, @LastPage INT, @TotalRecord MONEY 
SELECT @FirstPage = (@Page - 1) * @PageSize, 
     @LastPage = (@Page * @PageSize) + 1, 
     @TotalPage = 0, 
     @TotalRecord = 0 

-- DATA -- 
CREATE TABLE #Data(
    ID INT IDENTITY(1,1) NOT NULL, 
    Distance INT 
) 

DECLARE @TodayOpen nvarchar(100), @TodayClose nvarchar(100), @SQLSELECT NVARCHAR(MAX) 
SELECT @TodayOpen = DATENAME(dw,GETDATE())+'Open', @TodayClose = DATENAME(dw,GETDATE())+'Close', @SQLSELECT = '' 

SELECT @TotalRecord = COUNT(1) FROM #Data 
SELECT @TotalPage = CASE WHEN @TotalRecord = 0 THEN 0 ELSE CEILING(@TotalRecord/@PageSize) END 

SELECT @SQLSELECT = N' 
SELECT 
    B.[Address], 
    B.'+ @todayOpen +', 
    B.'+ @todayClose +' 
FROM #Data D 
    INNER JOIN dbo.Bis B WITH (NOLOCK) ON D.BizID = B.BizID 
    LEFT JOIN dbo.Category C WITH (NOLOCK) ON B.FIDCategory = C.CategoryID 
WHERE B.[Status] = 3 AND ID > '+ Convert(Varchar(10),@FirstPage) +' 
ORDER BY ID' 

EXEC (@SQLSELECT) 

DROP TABLE #Data 

END 
+0

ありがとう!!!!!!!!!! – Richard

1

などのSPを見てより良い解決策はINTそれを維持するために、パラメータとして渡すことです:

SET SQLSELECT = N' 
SELECT 
    B.[Address], 
    B.'+ @todayOpen +', 
    B.'+ @todayClose +' 
FROM #Data D 
    INNER JOIN dbo.Bis B WITH (NOLOCK) ON D.BizID = B.BizID 
    LEFT JOIN dbo.Category C WITH (NOLOCK) ON B.FIDCategory = C.CategoryID 
WHERE B.[Status] = 3 AND ID > @FirstPage 
ORDER BY ID' 

EXEC sp_executesql @SQLSELECT, N'@FirstPage INT', @FirstPage 
+0

ありがとう!!!!!!!!!! – Richard

関連する問題