使用 SQL Server 2008,我尝试构建一个字符串并使用 sp_executesql 执行它。我显然有一些引用是错误的。它似乎正在运行,但数据库并未删除。有人可以帮我纠正语法吗?
USE [master]
GO
DECLARE @sql NVARCHAR(500)
SET @sql = N' IF EXISTS (SELECT NAME FROM master.sys.databases sd where name =''@DBName'')
BEGIN
ALTER DATABASE [@DBName] SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [@DBName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [@DBName]
END';
EXECUTE sp_executesql @sql, N'@DBName sysname', @DBName = 'ReapirInformation'
GO
我尝试过添加和删除引号,但我似乎无法拨入正确的组合。当然欢迎任何提示或技巧。
Thanks,
~ck 在圣地亚哥
动态 SQL 不是这样工作的。
您仍然无法将参数传递给将用于代替对象名称的动态字符串。
您必须自己构造查询字符串,手动替换@DBName
与实际价值。但是,您可以在方程右侧使用参数,不带任何引号。
此外,当将对象名称放入查询中时,请始终使用QUOTENAME http://msdn.microsoft.com/en-us/library/ms176114.aspx功能。它将正确转义名称,因此不会出现 SQL 注入或由对象名称中的某些字符引起的不良行为。
SET @sql = N' IF EXISTS (SELECT NAME FROM master.sys.databases sd where name = @DBName)
BEGIN
ALTER DATABASE ' + quotename(@DBName, '[') + N' SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE ' + quotename(@DBName, '[') + N' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE ' + quotename(@DBName, '[') + N'
END';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)