[英]Invalid Column name error during execution of stored procedure
我无法执行存储过程。 它抛出一个错误
无效的列名“ DW201401”
用于执行存储过程的命令:
exec RM_UTIL_MODE server,'DW201401'
存储过程代码:
ALTER Procedure [dbo].[RM_UTIL_MODE]
@ServerName varchar(50),
@Value varchar(50)
As
Begin
declare @query nvarchar(max)
set @query = N'SELECT mode FROM ' + @ServerName +
N'.master.dbo.sysdatabases WHERE name =' + @Value
exec sp_executesql @query
End
但是,当我尝试单独运行查询时,如下所示,它给了我结果。
select mode, name
from server.master.dbo.sysdatabases
where name = 'DW201401'
大概问题是@Value
周围的@Value
:
declare @query nvarchar(max)
set @query = N'SELECT mode FROM '
+ @ServerName
+ N'.master.dbo.sysdatabases
WHERE name = '''+@Value+'''';
但是,我改用参数替换:
declare @query nvarchar(max) ;
set @query = N'SELECT mode
FROM ' + @ServerName + N'.master.dbo.sysdatabases
WHERE name = @value';
exec sp_executesql @query, N'@value varchar(50)', @value = @value;
您已经在使用sp_executesql
,因此不妨适当使用它。 注意:您不能替换服务器名称。
编辑:
为了详细说明评论,我将以这种方式编写代码:
declare @sql nvarchar(max) ;
set @sql = N'
SELECT mode
FROM @ServerName.master.dbo.sysdatabases
WHERE name = @value';
set @sql = replace(@sql, '@ServerName', quotename(@ServerName));
exec sp_executesql @sql, N'@value varchar(50)', @value = @value;
当使用动态SQL时,我不再使用字符串串联来组合查询。 相反,我放置了占位符并使用replace()
。 我发现连接很难维护,并且常常使SQL正在做什么。 尽管使用replace()
会有更多的开销(而且我经常多次执行),但值得避免错误和维护代码(此外,无论如何我的查询都会运行一段时间,所以开销是与查询时间相比最少)。
您的选择如下所示:
select mode, name from server.master.dbo.sysdatabases where name = DW201401
因此您需要在动态查询中添加转义引号:
exec RM_UTIL_MODE cefmtqcfindv3,'DW201401'
ALTER Procedure [dbo].[RM_UTIL_MODE]
@ServerName varchar(50),@Value varchar(50)
As
Begin
declare @query nvarchar(max)
set @query = N'SELECT mode FROM '
+ @ServerName
+ N'.master.dbo.sysdatabases
WHERE name ='''+@Value+''''
exec sp_executesql @query
End
就像一个建议一样,在构建动态sql时,请尝试使用PRINT
而不是EXEC
,然后获取打印的内容并进行尝试。 大多数时候,您会知道出了什么问题。
举个例子:
ALTER Procedure [dbo].[RM_UTIL_MODE]
@ServerName varchar(50),@Value varchar(50)
As
Begin
declare @query nvarchar(max)
set @query = N'SELECT mode FROM '
+ @ServerName
+ N'.master.dbo.sysdatabases
WHERE name ='''+@Value+''''
PRINT @query
--exec sp_executesql @query
End
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.