2009-11-24 43 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. 
相关问题