gpt4 book ai didi

sql-server - 我该如何做类似 : USE @databaseName 的事情

转载 作者:行者123 更新时间:2023-12-02 00:05:26 24 4
gpt4 key购买 nike

 DECLARE @DatabaseName NVARCHAR(max); SET @DatabaseName = 'MainDb'
USE @DatabaseName

行不通。如何制作?

最佳答案

如果您想像那样动态地执行它,则必须使用动态 SQL。意味着您想要在该数据库上下文中执行的任何内容,您也需要包含在动态 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 注入(inject),为此我将向您指出 Barry 答案中的链接。

为了防止 SQL 注入(inject),您还可以使用 QUOTENAME()函数,它将参数括在方括号中:

DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);

SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);

PRINT(@SQL);
-- USE [MainDb]

EXECUTE(@SQL);

关于sql-server - 我该如何做类似 : USE @databaseName 的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com