我正在尝试编写一个以表名作为参数的存储过程。是的我已经知道这是一个安全漏洞,但这是一个内部存储过程,不会面临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个字符的cmd变量中使用@tableName(nvarchar的最大值)?
答案 0 :(得分:8)
如果您使用SQL Server> = 2005,请尝试将nvarchar(4000)
替换为nvarchar(MAX)
。
答案 1 :(得分:3)
DECLARE @cmd NVARCHAR(MAX);
答案 2 :(得分:2)
将一些逻辑提取到视图或用户定义的函数中。
答案 3 :(得分:0)
使用
DECLARE @cmd VARCHAR(8000)
而不是DECLARE @cmd NVARCHAR(MAX);
NVARCHAR(MAX) ALLOWS ONLY 4000 CHARACTERS.