sql使用带变量的语句

Dre*_*ejc 26 sql-server sql-server-2005 dynamic-sql

我正在尝试使用SQL语句切换当前数据库.我尝试了以下方法,但所有尝试都失败了:

  1. 使用@DatabaseName
  2. EXEC sp_sqlexec @Sql - 其中@Sql ='USE ['+ @DatabaseName +']'

添加更多细节.

编辑:我想在两个单独的数据库上执行几项操作,其中两个数据库都配置了变量.像这样的东西:

USE Database1
SELECT * FROM Table1

USE Database2
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud)

Pre*_*gha 10

   exec sp_execsql @Sql
Run Code Online (Sandbox Code Playgroud)

数据库更改仅持续完成@sql的时间

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

  • select必须在@SQL中 - 正如我所说的那样,只能在@sql上使用 (3认同)
  • 这是一种解决方案,但对我的目的毫无用处. (3认同)

Alp*_*pha 10

我有同样的问题,我用一套丑陋但有用的GOTO来克服它.

我之前称之为"脚本运行器"的原因是我想要隐藏任何想要使用实际脚本的开发人员的复杂性和难看的方法.同时,我可以确保脚本以完全相同的方式在两个(可扩展到三个或更多)数据库中运行.

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
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您可以保留变量,如果您碰巧两次查看DECLARE语句,SQL Server不会出现问题.


Joe*_*win 9

前者的问题在于你所做的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
Run Code Online (Sandbox Code Playgroud)

  • Preet 上面的说法是正确的。尽管 USE 将适用于 @sql 语句,但它不会是永久性更改。使用参数化的 USE 也会带来各种性能/编译影响,我看不到任何替代工作。– goodgai 0 秒前 [删除此评论] (2认同)

KM.*_*KM. 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)
Run Code Online (Sandbox Code Playgroud)


小智 5

只是想感谢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)
Run Code Online (Sandbox Code Playgroud)