Sql server 无效的对象名称-SQL server 2005

Sql server 无效的对象名称-SQL server 2005,sql-server,stored-procedures,Sql Server,Stored Procedures,执行以下存储过程时,我得到无效的对象名dbo.Approved。对象dbo.Approved确实存在,所以这可能与我将表名作为参数传入的方式有关 我还应该补充的是,我要么通过.NET执行该过程,要么从SMS中获得错误 @tableName as nvarchar(100) AS BEGIN EXEC(' UPDATE T1 SET T1.NPTid = dbo.Locations.NPT_ID FROM ' + '[' + @tableName + '] As T1 INNER JO

执行以下存储过程时,我得到无效的对象名dbo.Approved。对象dbo.Approved确实存在,所以这可能与我将表名作为参数传入的方式有关

我还应该补充的是,我要么通过.NET执行该过程,要么从SMS中获得错误

 @tableName as nvarchar(100)
AS
 BEGIN

EXEC('

UPDATE T1
SET T1.NPTid = dbo.Locations.NPT_ID
FROM '  + '[' + @tableName +  '] As T1
INNER JOIN dbo.Locations  ON T1.Where_Committed = dbo.Locations.Location_Name
')

END
在收到Joe和JNK的帮助后进行编辑存储过程现在是这样的,但我得到了错误

Msg 102, Level 15, State 1, Procedure sp_Updater, Line 14  

Incorrect syntax near 'QUOTENAME'.
新的狂欢

@tableName as nvarchar(100),
@schemaName as nvarchar(20)
AS
BEGIN  



EXEC('
--Update NPT
UPDATE T1
SET T1.NPTid = dbo.Locations.NPT_ID
FROM '  + QUOTENAME(@schemaName) + '.' + QUOTENAME(@tableName) + ' As T1
INNER JOIN dbo.Locations  ON T1.Where_Committed = dbo.Locations.Location_Name
')

END

使用字符串中的方括号,表引用将变成无效的
[dbo.Approved]
。参考文件应为
[dbo].[Approved]

您可能需要考虑将架构名和表名传递为两个独立的参数。 最好使用该函数,而不是硬编码方括号

declare @sql nvarchar(1000)

set @sql = N'UPDATE T1
SET T1.NPTid = dbo.Locations.NPT_ID
FROM '  + QUOTENAME(@schemaName) + N'.' + QUOTENAME(@tableName) + N' As T1
INNER JOIN dbo.Locations  ON T1.Where_Committed = dbo.Locations.Location_Name
'

EXEC (@sql)

您过早地包装了id,所以“['+@tableName+']在应该是[dbo].[approved].

表名和列名实际上是sysname(这是,正如我记得的那样,
NVARCHAR(128)
NVARCHAR(256)
,我记不太清楚了)

此外,您还容易受到SQL注入攻击。您应该通过对照
信息\u模式检查
@tableName
是否为真实表来验证它


最后,为了绝对确定,如果实际表中有一些奇数字符,您应该使用
QUOTENAME(@tableName)
来完全转义表名。

如果您对三部分名称使用方括号,则需要在每个部分(而不是句点)周围使用方括号,即:

[dbo].[Approved]

如果将
dbo.Approved
作为参数传递,则动态SQL会将其读取为
[dbo.Approved]
,只有当您有一个名为该表(即dbo.是表名的一部分,而不是架构)的表时,它才会起作用

将其更改为:

'…[dbo].['+@tablename+']…


只需将
Approved
作为参数传递即可。

如何将表名作为参数传递?“dbo.Approved”或“Approved”是的,您可以忽略Alter Proc位问题在于括号,而不是数据类型:)谢谢。我知道它很容易受到SQL注入的攻击,但它只是一个助手应用程序,我只能在一台机器上运行。像这样?来自[dbo]。+QUOTENAME(@tableName)+']AsT1@Doozer-你不需要在
前面加上结束括号,因为T1
@Joe Stefanelli-如果可以的话,我会加上2:)Msg 102,15级,状态1,过程sp_Updater,第14行“QUOTENAME”附近的语法不正确。谢谢你的帮助guys@Doozer1979:将字符串构建到变量中,如
@sql nvarchar(1000)
,然后
exec(@sql)
。我也会更新我的答案。