加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读