sql use statement with variable

前端 未结 10 1262
花落未央
花落未央 2020-11-30 08:23

I\'m trying to switch the current database with a SQL statement. I have tried the following, but all attempts failed:

  1. USE @DatabaseName
  2. EXEC sp_sqlexe
相关标签:
10条回答
  • 2020-11-30 09:04

    The problem with the former is that what you're doing is USE 'myDB' rather than USE myDB. you're passing a string; but USE is looking for an explicit reference.

    The latter example works for me.

    declare @sql varchar(20)
    select @sql = 'USE myDb'
    EXEC sp_sqlexec @Sql
    
    -- also works
    select @sql = 'USE [myDb]'
    EXEC sp_sqlexec @Sql
    
    0 讨论(0)
  • 2020-11-30 09:04

    try this:

    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)
    
    0 讨论(0)
  • 2020-11-30 09:04

    Use exec sp_execsql @Sql

    Example

    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
    
    0 讨论(0)
  • 2020-11-30 09:07

    I case that someone need a solution for this, this is one:

    if you use a dynamic USE statement all your query need to be dynamic, because it need to be everything in the same context.

    You can try with SYNONYM, is basically an ALIAS to a specific Table, this SYNONYM is inserted into the sys.synonyms table so you have access to it from any context

    Look this static statement:

    CREATE SYNONYM MASTER_SCHEMACOLUMNS FOR Master.INFORMATION_SCHEMA.COLUMNS
    SELECT * FROM MASTER_SCHEMACOLUMNS
    

    Now dynamic:

    DECLARE @SQL VARCHAR(200)
    DECLARE @CATALOG VARCHAR(200) = 'Master'
    
    IF EXISTS(SELECT * FROM  sys.synonyms s WHERE s.name = 'CURRENT_SCHEMACOLUMNS')
    BEGIN
    DROP SYNONYM CURRENT_SCHEMACOLUMNS
    END
    
    SELECT @SQL = 'CREATE SYNONYM CURRENT_SCHEMACOLUMNS FOR '+ @CATALOG +'.INFORMATION_SCHEMA.COLUMNS';
    EXEC sp_sqlexec @SQL
    
    --Your not dynamic Code
    SELECT * FROM CURRENT_SCHEMACOLUMNS
    

    Now just change the value of @CATALOG and you will be able to list the same table but from different catalog.

    0 讨论(0)
  • 2020-11-30 09:15

    Just wanted to thank KM for his valuable solution. I implemented it myself to reduce the amount of lines in a shrinkdatabase request on SQLServer. Here is my SQL request if it can help anyone :

    -- 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)
    
    0 讨论(0)
  • 2020-11-30 09:15

    If SQLCMD is an option, it supports scripting variables above and beyond what straight T-SQL can do. For example: http://msdn.microsoft.com/en-us/library/ms188714.aspx

    0 讨论(0)
提交回复
热议问题