2010-12-17 36 views
2

當執行以下存儲過程時,我得到無效的對象名稱dbo.Approved。對象dbo.Approved確實存在,所以大概這是與我傳遞表名作爲參數的方式有關嗎?無效的對象名稱 - SQL服務器2005

我還應該補充一點,我通過.NET執行程序或從SMSS內部執行程序來獲得錯誤。

@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 

編輯從喬和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 
+0

你是如何將表名作爲參數傳遞的? 「dbo.Approved」或「Approved」 – Ramy 2010-12-17 16:38:41

+0

是的,您可以忽略Alter Proc位 – MrBliz 2010-12-17 16:39:41

回答

5

用方括號在你的字符串,你表引用變成[dbo.Approved],這是無效的。改爲參考應該是[dbo].[Approved]

您可能需要考慮將模式名稱和表名稱作爲兩個單獨的參數傳遞。

使用QUOTENAME函數代替硬編碼方括號也會更好。

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

+1作爲'QUOTENAME' – JNK 2010-12-17 16:41:01

+0

是這樣的嗎? FROM [dbo]。'+ QUOTENAME(@tableName)+']作爲T1 – MrBliz 2010-12-17 16:46:15

+0

@Doozer - 在'AS T1'之前不需要右括號' – JNK 2010-12-17 16:46:45

2

你的包裹ID太早所以 '[' + @tablename +「]越來越被翻譯成[dbo.approved]當它應該是[DBO]。[批准]

1

表名和列名實際上是sysname(這是因爲我記得NVARCHAR(128)NVARCHAR(256) - 關閉我的頭頂我不太記得)

此外,您很容易受到SQL注入攻擊。您應該驗證@tableName是一個真正的表通過檢查其對INFORMATION_SCHEMA.TABLES

最後,只是爲了絕對確保,萬一真表中有一些奇怪的字符,你應該使用QUOTENAME(@tableName)完全逃脫表名。

+1

括號是問題,而不是數據類型:) – JNK 2010-12-17 16:42:59

+0

乾杯。我知道它很容易受到SQL注入攻擊,但它只是一個幫助器應用程序,只能在一臺機器上運行,而我自己。 – MrBliz 2010-12-17 16:48:16

4

如果您使用的三部分名稱括號,你需要有大約每節括號,但不是時期,即:

[dbo].[Approved]

如果傳遞dbo.Approved爲您的參數,您的動態SQL正在將它讀爲[dbo.Approved],只有當您有一個名爲該表的表(即dbo。是表名稱的一部分而不是架構)時纔會起作用。

將其更改爲:

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

而只是通過Approved作爲參數。