2009-11-24 49 views
3

我正在嘗試編寫一個以表名作爲參數的存儲過程。是的,我已經知道這是一個安全漏洞,但這是一個內部存儲過程,不會面臨SQL注入的典型風險。以表名作爲參數和查詢超過4000個字符的SQL

我有什麼迄今是像下面這樣:

CREATE PROCEDURE [dbo].[myprocedure] 
    @tableName sysname 
AS 
DECLARE @cmd nvarchar(4000) 
SET @cmd = N' Select blah blah from ' + @tableName 
EXEC (@cmd) 
GO 

查詢將在理論工作,但我的問題是,我查詢超過4000個字符長。是否有另一種方法來使用長度超過4000個字符(這是nvarchar的最大值)的cmd變量中的@tableName?

回答

8

如果您使用SQL Server> = 2005,請嘗試用nvarchar(MAX)替換nvarchar(4000)

+0

這沒有奏效。我正在運行SQL Server 2005.問題是,MAX實際上是4000. – a432511 2009-11-24 16:32:18

+0

@ a432511:這是不正確的。 varchar(MAX)的最大大小是2^31。 – 2009-11-24 16:35:11

+0

嗯......我開始認爲你對這個建議是正確的,它可能已經解決了我的主要問題,但我的查詢中也有一個語法問題。謝謝您的幫助! – a432511 2009-11-24 16:36:17

2

將您的一些邏輯提取到視圖或用戶定義的函數中。

3
DECLARE @cmd NVARCHAR(MAX); 
+0

這沒有奏效。我正在運行SQL Server 2005.問題是,MAX實際上是4000. – a432511 2009-11-24 16:31:39

+0

不,MAX是2^31-1這實際上是2147483647 – MartW 2009-11-24 16:35:17

+0

1+你和Heinzi一起是對的,但他首先回應。謝謝你的幫助 – a432511 2009-11-24 16:37:15

0

使用

,而不是DECLARE @cmd NVARCHAR(MAX);

NVARCHAR(MAX) ALLOWS ONLY 4000 CHARACTERS. 
相關問題