2013-01-18 29 views
-2

可能重複:
SQL Server: how to get a database name as a parameter in a stored procedure語法錯誤在動態SQL與數據庫名稱作爲變量

在下面的存儲過程,我傳遞的數據庫名作爲參數,但目前用於測試我是通過在過程中聲明的字符串的數據庫名稱。

請指教,因爲我在SET語法中遇到錯誤,它無法識別我傳遞的數據庫名稱。

USE [smtpFetch] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER Procedure [dbo].[checkForUpdateV] 
(
    @ctsCode Varchar(100) 
) 
As 

BEGIN 

Declare @dbName varchar(100) 
Declare @stDB TABLE 
(
change_version_state varchar(max), 
change_version_status varchar(200), 
uniqueid varchar(20), 
Country_code varchar(15), 
Research_date varchar(15), 
data_date varchar(15), 
Make varchar(50), 
Model varchar(50), 
Versions varchar(255), 
Model_year varchar(15), 
doors varchar(5), 
body varchar(5) 
); 
DECLARE @number_days as INT 
DECLARE @DATAD as nvarchar(max) 
DECLARE @DATAD2 as varchar(max) 
SET @number_days = 5 
SET @[email protected] 
SET @dbName='SSCRUS_CS2002' 
SET @DATAD =N'Delete from ' + @ctsCode 
select @DATAD 
--print @dbName; 
set @[email protected] 
INSERT INTO @stdb 
set @DATAD2 = "SELECT 
    STUFF(
       ( SELECT ', ' + st105.full_text 
        FROM" + @dbName + ".dbo.version v2 
        JOIN " + @dbName + ".dbo.equipment e105 
        ON e105.vehicle_id = v2.vehicle_id AND e105.schema_id = 105 
        JOIN " + @dbName + ".dbo.schema_text st105 
        ON st105.schema_id = 105 AND st105.data_value = e105.data_value AND st105.language_id = 19 
        WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, CONVERT(char(8), v2.id_103))) > - @number_days) AND 
           v.vehicle_id = v2.vehicle_id 
        FOR XML PATH('') 
      ),1,1,'' 
      ) AS Change_version_state, 

    STUFF(
       ( SELECT ', ' + st106.full_text 
        FROM " + @dbName + ".dbo.version v3 
        JOIN " + @dbName + ".dbo.equipment e106 
        ON e106.vehicle_id = v3.vehicle_id AND e106.schema_id = 106 
        JOIN " + @dbName + ".dbo.schema_text st106 
        ON st106.schema_id = 106 AND st106.data_value = e106.data_value AND st106.language_id = 19 
        WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, CONVERT(char(8), v3.id_103))) > - @number_days) AND 
           v.vehicle_id = v3.vehicle_id 
        FOR XML PATH('') 
      ),1,1,'' 
      ) AS Change_version_status, 
    v.id_101 AS [Unique ID], 
    v.id_109 AS Country, 
    v.id_103 AS [Research Date], 
    v.id_104 AS [Data Date], 
    v.id_128 AS Make, 
    v.id_129 AS Model, 
    v.id_131 AS Version, 
    v.id_108 AS [Model Year], 
    v.id_605 AS Doors, 
    v.id_606 AS Body 

    FROM " + @dbName + ".dbo.version v 
    WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, CONVERT(char(8), v.id_103))) > - @number_days) 
    ORDER BY [Unique ID], Change_version_status, Change_version_state" 
    execute sp_executesql @DATAD2 
    --select * from @stdb 
    END 

上面的存儲過程給

Msg 156, Level 15, State 1, Procedure checkForUpdateV, Line 41 
Incorrect syntax near the keyword 'set'. 

Msg 103, Level 15, State 4, Procedure checkForUpdateV, Line 45 
The identifier that starts with '.dbo.equipment e105 
ON e105.vehicle_id = v2.vehicle_id AND e105.schema_id = 105 
' is too long. Maximum length is 128. 

Msg 103, Level 15, State 4, Procedure checkForUpdateV, Line 47 
The identifier that starts with '.dbo.schema_text st105 
ON st105.schema_id = 105 AND st105.data_value = e105.data_value 
AND st105.lang' is too long. Maximum length is 128. 

Msg 103, Level 15, State 4, Procedure checkForUpdateV, Line 58 
The identifier that starts with '.dbo.equipment e106 
ON e106.vehicle_id = v3.vehicle_id AND e106.schema_id = 106 
' is too long. Maximum length is 128. 

Msg 103, Level 15, State 4, Procedure checkForUpdateV, Line 60 
The identifier that starts with '.dbo.schema_text st106 
ON st106.schema_id = 106 AND st106.data_value = e106.data_value 
AND st106.lang' is too long. Maximum length is 128. 

Msg 103, Level 15, State 4, Procedure checkForUpdateV, Line 78 
The identifier that starts with '.dbo.version v 
WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, 
CONVERT(char(8), v.id_103))) > - @number_days) 
ORDER ' is too long. Maximum length is 128. 
+0

我看到這裏有一個問題'code'FROM 「+ @DbName +」 .dbo.version V2'code' – Hiten004

回答

0

以下代碼解析「Command(s)completed successfully。」。在mumsms。我已經從你的代碼中刪除了所有的sysntext錯誤。希望這有助於

USE [smtpFetch] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER Procedure [dbo].[checkForUpdateV] 
(
    @ctsCode Varchar(100) 
) 
As 

BEGIN 

Declare @dbName varchar(100) 
Declare @stDB TABLE 
(
change_version_state varchar(max), 
change_version_status varchar(200), 
uniqueid varchar(20), 
Country_code varchar(15), 
Research_date varchar(15), 
data_date varchar(15), 
Make varchar(50), 
Model varchar(50), 
Versions varchar(255), 
Model_year varchar(15), 
doors varchar(5), 
body varchar(5) 
); 
DECLARE @number_days as INT 
DECLARE @DATAD as nvarchar(max) 
DECLARE @DATAD2 as varchar(max) 
SET @number_days = 5 
SET @[email protected] 
SET @dbName='SSCRUS_CS2002' 
SET @DATAD =N'Delete from ' + @ctsCode 
select @DATAD 
--print @dbName; 
set @[email protected] 
--INSERT INTO @stdb 
Select @DATAD2 = ' INSERT INTO @stdb SELECT 
    STUFF(
       ( SELECT '','' st105.full_text 
        FROM ' + @dbName + '.dbo.version v2 
        JOIN ' + @dbName + '.dbo.equipment e105 
        ON e105.vehicle_id = v2.vehicle_id AND e105.schema_id = 105 
        JOIN ' + @dbName + '.dbo.schema_text st105 
        ON st105.schema_id = 105 AND st105.data_value = e105.data_value AND st105.language_id = 19 
        WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, CONVERT(char(8), v2.id_103))) > - @number_days) AND 
           v.vehicle_id = v2.vehicle_id 
        FOR XML PATH('') 
      ),1,1,'' 
      ) AS Change_version_state, 

    STUFF(
       ( SELECT '', '' + st106.full_text 
        FROM ' + @dbName + '.dbo.version v3 
        JOIN ' + @dbName + '.dbo.equipment e106 
        ON e106.vehicle_id = v3.vehicle_id AND e106.schema_id = 106 
        JOIN ' + @dbName + '.dbo.schema_text st106 
        ON st106.schema_id = 106 AND st106.data_value = e106.data_value AND st106.language_id = 19 
        WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, CONVERT(char(8), v3.id_103))) > - @number_days) AND 
           v.vehicle_id = v3.vehicle_id 
        FOR XML PATH('') 
      ),1,1,'' 
      ) AS Change_version_status, 
    v.id_101 AS [Unique ID], 
    v.id_109 AS Country, 
    v.id_103 AS [Research Date], 
    v.id_104 AS [Data Date], 
    v.id_128 AS Make, 
    v.id_129 AS Model, 
    v.id_131 AS Version, 
    v.id_108 AS [Model Year], 
    v.id_605 AS Doors, 
    v.id_606 AS Body 

    FROM ' + @dbName + '.dbo.version v 
    WHERE (DATEDIFF(day, { fn NOW() }, CONVERT(datetime, CONVERT(char(8), v.id_103))) > - @number_days) 
    ORDER BY [Unique ID], Change_version_status, Change_version_state' 
    execute sp_executesql @DATAD2 
    --select * from @stdb 
    END 

- TEMP表

Create table #@stDB (
change_version_state varchar(max), 
change_version_status varchar(200), 
uniqueid varchar(20), 
Country_code varchar(15), 
Research_date varchar(15), 
data_date varchar(15), 
Make varchar(50), 
Model varchar(50), 
Versions varchar(255), 
Model_year varchar(15), 
doors varchar(5), 
body varchar(5) 
) 
+0

非常感謝你是明星 –

+0

還有一個問題,目前我插入OUTPUT進入@stdb是否有一種方法,我可以將它指向物理表....感謝 –

+0

感謝您的上述修改後的查詢,我的查詢現在編譯但是當我執行時我得到一個下面的錯誤(0行受影響)Msg 214,級別16,狀態2,過程sp_executesql,行1過程期望參數'@statement'類型'ntext/nchar/nvarchar的」。 - –

1

你的語法有幾個問題,一個錯誤。

您不能將SET操作作爲INSERT語句的一部分。

INSERT INTO @stdb 
set @DATAD2 = "SELECT 

不要使用雙引號動態SQL

set @DATAD2 = "SELECT 

應該

set @DATAD2 = 'SELECT 

注意你的間距使用時+語法:

FROM" + @dbName + ".dbo.version v2 

FROM ' + @dbName + '.dbo.version v2 
+0

輝煌。感謝您的及時回覆。現在只有一個錯誤。請幫助我如何處理','Msg 102,Level 15,State 1,Procedure checkForUpdateV,Line 44 ','附近語法錯誤。 –

+0

感謝您指出,我的查詢現在編譯但是當我執行時我得到一個以下錯誤(0行受影響) 消息214,級別16,狀態2,過程sp_executesql,行1 過程期望參數'@語句'類型'ntext/nchar/nvarchar'。 –

+0

感謝我使它現在工作,但我期待輸出存儲在@stdb表變量,但現在它沒有發生。它返回空白 –