31

現在のデータベースを SQL ステートメントで切り替えようとしています。次のことを試しましたが、すべての試みが失敗しました:

  1. @データベース名を使用
  2. EXEC sp_sqlexec @Sql -- ここで @Sql = 'USE [' + @DatabaseName + ']'

もう少し詳細を追加します。

編集:両方が変数で構成されている2つの別々のデータベースでいくつかのことを実行したいと思います。このようなもの:

USE Database1
SELECT * FROM Table1

USE Database2
SELECT * FROM Table2
4

10 に答える 10

13

前者の問題は、あなたがやっていることはUSE 'myDB'むしろUSE myDB. 文字列を渡しています。しかし、USE は明示的な参照を探しています。

後者の例は私にとってはうまくいきます。

declare @sql varchar(20)
select @sql = 'USE myDb'
EXEC sp_sqlexec @Sql

-- also works
select @sql = 'USE [myDb]'
EXEC sp_sqlexec @Sql
于 2009-06-24T09:05:24.723 に答える
12
   exec sp_execsql @Sql

DB の変更は、@sql を完了するまでの間のみ続きます

http://blog.sqlauthority.com/2007/07/02/sql-server-2005-comparison-sp_executesql-vs-executeexec/

于 2009-06-24T09:05:07.707 に答える
11

私は同じ問題を抱えています。醜い-しかし便利な-GOTOのセットでそれを克服しました。

私が何よりもまず「スクリプトランナー」と呼ぶ理由は、実際のスクリプトを操作したいだけの開発者からは、複雑さと醜いアプローチを隠したいからです。同時に、スクリプトが2つの(3つ以上に拡張可能な)データベースでまったく同じ方法で実行されることを確認できます。

GOTO ScriptRunner

ScriptExecutes:

--------------------ACTUAL SCRIPT--------------------
-------- Will be executed in DB1 and in DB2 ---------
--TODO: Your script right here

------------------ACTUAL SCRIPT ENDS-----------------

GOTO ScriptReturns

ScriptRunner:
    USE DB1
    GOTO ScriptExecutes

ScriptReturns:
    IF (db_name() = 'DB1')
    BEGIN
        USE DB2
        GOTO ScriptExecutes
    END

このアプローチを使用すると、変数を保持することができ、DECLAREステートメントを2回実行しても、SQLServerが異常終了することはありません。

于 2012-11-08T17:18:10.037 に答える
6

KM の貴重なソリューションに感謝したいと思います。SQLServer でのデータベース縮小リクエストの行数を減らすために、自分で実装しました。誰にでも役立つ場合、これが私のSQLリクエストです。

-- Declare the variable to be used
DECLARE @Query varchar (1000)
DECLARE @MyDBN varchar(11);
-- Initializing the @MyDBN variable (possible values : db1, db2, db3, ...)
SET @MyDBN = 'db1';
-- Creating the request to execute
SET @Query='use '+ @MyDBN +'; ALTER DATABASE '+ @MyDBN +' SET RECOVERY SIMPLE WITH NO_WAIT; DBCC SHRINKDATABASE ('+ @MyDBN +', 1, TRUNCATEONLY); ALTER DATABASE '+ @MyDBN +' SET RECOVERY FULL WITH NO_WAIT'
-- 
EXEC (@Query)
于 2016-07-27T08:52:57.947 に答える
5

これを試して:

DECLARE @Query         varchar(1000)
DECLARE @DatabaseName  varchar(500)

SET @DatabaseName='xyz'
SET @Query='SELECT * FROM Server.'+@DatabaseName+'.Owner.Table1'
EXEC (@Query)

SET @DatabaseName='abc'
SET @Query='SELECT * FROM Server.'+@DatabaseName+'.Owner.Table2'
EXEC (@Query)
于 2009-06-24T12:07:52.733 に答える
1

SQLCMD がオプションの場合、単純な T-SQL が実行できる以上のスクリプト変数がサポートされます。例: http://msdn.microsoft.com/en-us/library/ms188714.aspx

于 2009-08-11T21:25:13.317 に答える
0

あなたはこれを行うことができます:

Declare @dbName nvarchar(max);
SET @dbName = 'TESTDB';

Declare @SQL nvarchar(max);
select @SQL = 'USE ' + @dbName +'; {can put command(s) here}';
EXEC (@SQL);

{but not here!}

これは、次のような再帰的選択を実行できることを意味します。

Declare @dbName nvarchar(max);
SET @dbName = 'TESTDB';
Declare @SQL nvarchar(max);

SELECT @SQL = 'USE ' + @dbName + '; ' +(Select ... {query here}
For XML Path(''),Type)
.value('text()[1]','nvarchar(max)');

Exec (@SQL)
于 2016-08-22T12:50:07.473 に答える
-1

使用するexec sp_execsql @Sql

DECLARE @sql as nvarchar(100)  
DECLARE @paraDOB datetime  
SET @paraDOB = '1/1/1981'  
SET @sql=N'SELECT * FROM EmpMast WHERE DOB >= @paraDOB'  
exec sp_executesql @sql,N'@paraDOB datetime',@paraDOB
于 2009-06-24T09:16:26.043 に答える
-2
-- If you are using a variable for the database name. 
-- Try something like this. 

DECLARE @DBName varchar(50)
Set @DBName = 'Database1'; /*  could be passed in by a parameter. */

IF( @DBName = 'Database1')
Begin
    USE [Database1];
SELECT  FROM Table1;
End

IF( @DBName = 'Database2')
Begin
USE [Database2];
SELECT  FROM Table2;
End

IF( @DBName is null)
Begin
USE [Database1];
End
于 2009-08-11T18:16:05.930 に答える