Sql server 2008 数据库名为变量的动态SQL中的语法错误

Sql server 2008 数据库名为变量的动态SQL中的语法错误,sql-server-2008,tsql,stored-procedures,Sql Server 2008,Tsql,Stored Procedures,可能重复: 在下面的存储过程中,我将数据库名称作为参数传递,但目前用于测试的数据库名称是通过过程中声明的字符串传递的 请告知,我在SET语法中出现错误,无法识别我传递的db名称 USE [smtpFetch] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER Procedure [dbo].[checkForUpdateV] ( @ctsCode Varchar(100) ) As BEGIN Declare @

可能重复:

在下面的存储过程中,我将数据库名称作为参数传递,但目前用于测试的数据库名称是通过过程中声明的字符串传递的

请告知,我在
SET
语法中出现错误,无法识别我传递的db名称

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 @ctsCode=@ctsCode
SET @dbName='SSCRUS_CS2002'
SET @DATAD =N'Delete from ' + @ctsCode
select @DATAD
--print @dbName;
set @DATAD2=@DATAD2
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.

您的语法有一些问题

不能在INSERT语句中执行集合操作

INSERT INTO @stdb
set @DATAD2 = "SELECT  
不要对动态SQL使用双引号

set @DATAD2 = "SELECT  
应该是

set @DATAD2 = 'SELECT 
FROM '  + @dbName + '.dbo.version v2 
使用+语法时注意间距:

FROM"  + @dbName + ".dbo.version v2 
应该是

set @DATAD2 = 'SELECT 
FROM '  + @dbName + '.dbo.version v2 
以下代码是在mu ssms上解析“成功完成命令”。我已从您的代码中删除所有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 @ctsCode=@ctsCode
SET @dbName='SSCRUS_CS2002'
SET @DATAD =N'Delete from ' + @ctsCode
select @DATAD
--print @dbName;
set @DATAD2=@DATAD2
--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
--临时表

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)
)

我从“++@dbName+”.dbo.version v2
code
中看到一个问题。谢谢你的及时回复。现在只有一个错误。请帮助我如何处理“,”Msg 102,级别15,状态1,过程checkForUpdateV,第44行“,”附近的语法不正确。感谢您指出,我的查询现在已编译,但当我执行时,我会收到以下错误(0行受影响)Msg 214,级别16,状态2,过程sp_executesql,第1行过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。感谢我现在让它工作,但是我希望输出存储在@stdb tablevariable中,但现在它没有发生。返回空白谢谢你非常感谢你开始还有一个问题,目前我的插入输出将进入@stdb是否有办法将其导入物理表…感谢上面修改的查询,我的查询现在已编译,但是当我执行时,我得到一个错误(受影响的0行)Msg 214,级别16,状态2,程序sp_executesql,第1行程序需要类型为“ntext/nchar/nvarchar”的参数“@statement”。-谢谢,我现在让它工作了,但是我希望输出存储在@stdb tablevariable中,但是现在它没有发生。返回空白–是的,您可以将其导入物理表。很高兴我能帮忙。