【问题标题】:Dynamic SQL "USE [DB]" not worked动态 SQL“USE [DB]”不起作用
【发布时间】:2017-03-10 01:48:28
【问题描述】:

我使用动态sql创建数据库和表

这是 sql 脚本

DECLARE @DatabaseName VARCHAR(50) = N'test';
EXECUTE ('CREATE DATABASE [' +@DatabaseName+']');
EXECUTE('USE ' + @DatabaseName)
GO
CREATE SCHEMA [Framework]
GO

我得到的错误

Msg 2714, Level 16, State 6, Line 1
There is already an object named 'Framework' in the database.
Msg 2759, Level 16, State 0, Line 1
CREATE SCHEMA failed due to previous errors

.

这个错误是因为 EXECUTE('USE ' + @DatabaseName) 不起作用

我尝试使用

SET @SQL02  = 'USE ['+ convert(nvarchar(50),@DatabaseName) +']; SELECT DB_NAME();'
exec sp_executesql @SQL02

但不工作

我能做什么?

【问题讨论】:

  • 标记您正在使用的 dbms。 (也许是 SQL-Server?)
  • 我使用的 SQL 版本 2012
  • 执行在自己的实例中运行。您应该在同一 EXECUTE 命令中包含所有操作,以便 USE <database> 正常工作。
  • 另外,在使用 @DatabaseName 变量时使用 QUOTENAME()

标签: sql sql-server sql-server-2012 dynamic-sql


【解决方案1】:
DECLARE @Query VARCHAR(200); 
SET @Query = CONCAT('USE ', QUOTENAME('<MyDatabase>'), '; ', 'select DB_NAME();');

EXECUTE (@Query);

只要您保持在一个EXECUTE 内,这将返回&lt;MyDatabase&gt;

【讨论】:

    【解决方案2】:

    我更喜欢这种形式的远程执行:

    declare @sql nvarchar(max) = N'select Db_Name()';
    
    <DatabaseName>.sys.sp_executesql @sql;
    

    你可以把这个逻辑变成一个更方便的形式,把它做成一个存储过程:

    create procedure dbo.usp_ExecuteSqlCommand (
        @databaseName sysname
      , @sqlCommand nvarchar(max)
    )
    as
    begin;
        set nocount on;
        set xact_abort on;
    
        declare @innerStatement nvarchar(max) = @sqlCommand;
        declare @outerStatement nvarchar(max);
    
        set @databaseName = QuoteName(ParseName(@databaseName, 1), N'[');
        set @outerStatement = @databaseName + N'.sys.sp_executesql @stmt = @innerStatement;';
    
        execute sys.sp_executesql
            @stmt = @outerStatement
          , @params = N'@innerStatement nvarchar(max)'
          , @innerStatement = @innerStatement;
    end;
    

    用法很明显:

    execute dbo.usp_ExecuteSqlCommand
        @databaseName = N'master'
      , @sqlCommand = N'select Db_Name();';
    

    【讨论】:

    • 一个相当优雅的解决方案。不错。
    【解决方案3】:

    试试这个:(如果你使用execute,db上下文只会改变那个execute)

    DECLARE @DatabaseName VARCHAR(50) = N'test';
    EXECUTE ('CREATE DATABASE [' +@DatabaseName+']');
    use [test]
    go
    CREATE SCHEMA [Framework]
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 2018-01-26
      • 2023-03-10
      • 1970-01-01
      • 2021-04-07
      • 2016-10-31
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多