sql-server – 如何执行以下操作:USE @databaseName
发布时间:2020-12-12 16:15:50 所属栏目:MsSql教程 来源:网络整理
导读:DECLARE @DatabaseName NVARCHAR(max); SET @DatabaseName = 'MainDb' USE @DatabaseName 不行怎么做? 解决方法 如果要动态执行动态SQL,则必须使用动态SQL.这意味着您希望在该DB的上下文中执行任何操作,您还需要在动态SQL语句中包含它. 即假设要列出MainDB
DECLARE @DatabaseName NVARCHAR(max); SET @DatabaseName = 'MainDb' USE @DatabaseName 不行怎么做? 解决方法如果要动态执行动态SQL,则必须使用动态SQL.这意味着您希望在该DB的上下文中执行任何操作,您还需要在动态SQL语句中包含它.即假设要列出MainDB中的所有表: 这将不起作用,因为USE语句在不同的上下文中 – 一旦EXECUTE运行,以下SELECT将不会在同一上下文中运行,因此不会在MainDb中运行(除非连接已设置为MainDb) DECLARE @DatabaseName NVARCHAR(MAX) SET @DatabaseName = 'MainDb' EXECUTE('USE ' + @DatabaseName) -- SQL injection risk! SELECT name FROM sys.tables 所以你需要做: DECLARE @DatabaseName NVARCHAR(MAX) SET @DatabaseName = 'MainDb' EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk! 当然,您需要非常小心SQL注入,为此我指向Barry的答案中的链接. 为了防止SQL注入,您还可以使用QUOTENAME()函数,它将参数包含在方括号中: DECLARE @DatabaseName sysname = 'MainDb',@SQL NVARCHAR(MAX); SET @SQL = N'USE ' + QUOTENAME(@DatabaseName); PRINT(@SQL); -- USE [MainDb] EXECUTE(@SQL); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读