2009-06-01 8 views
52

Есть ли способ сохранить переменную на ходу?Есть ли способ сохранить переменную в пути?

Declare @bob as varchar(50); 
Set @bob = 'SweetDB'; 
GO 
USE @bob --- see note below 
GO 
INSERT INTO @bob.[dbo].[ProjectVersion] ([DB_Name], [Script]) VALUES (@bob,'1.2') 

Смотрите этот SO вопрос по линии 'USE @bob'.

+0

Почему ты нужно определить имя таблицы с именем БД?Думаю, аналогичный вопрос был задан до этого. – shahkalpesh

+0

И нет возможности квалифицировать имена таблиц с именем базы данных в такой переменной. С его предыдущим вопросом об использовании переменной с USE-выражением, я предполагаю, что ему нужно будет делать все в динамическом SQL со всей болью, которая тянется к таблице. –

+0

Фактический скрипт объединяет 4 разные базы данных. Я прокомментировал инструкции для поиска и замены dbName1, dbName2, dbName3 и dbName4. Я просто подумал, что было бы меньше ошибок, если бы клиент просто установил четыре переменные. – NitroxDM

ответ

25

Команда go используется для разделения кода на отдельные партии. Если это именно то, что вы хотите сделать, то вы должны использовать его, но это означает, что партии фактически раздельны, и вы не можете делиться между ними переменными.

В вашем случае решение прост; вы можете просто удалить операторы go, они не нужны в этом коде.

Замечание: вы не можете использовать переменную в операторе use, это должно быть имя базы данных.

+0

Некоторые SQL-выражения должны быть первым оператором в блоке (область между операторами GO). Например: CREATE PROCEDURE или CREATE FUNCTION должны выполняться перед любыми другими операторами - либо в верхней части скрипта, либо сразу же после оператора GO (примечание: перед этими утверждениями допускаются пробелы и комментарии). При выполнении сценариев, когда такие утверждения должны выполняться после другой логики, требуются инструкции GO. Но я должен согласиться с тем, что в большинстве случаев инструкции GO могут быть удалены. – Zarepheth

+0

@Zarepheth: Хорошая точка. Это не нужно в этом конкретном коде, но полезно знать, что в некоторых случаях они могут понадобиться. – Guffa

+1

Почему downvote? Если вы не объясните, что это такое, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

1

Не уверен, если это помогает

declare @s varchar(50) 
set @s='Northwind' 

declare @t nvarchar(100) 
set @t = 'select * from ' + @s + '.[dbo].[Customers]' 

execute sp_executesql @t
84

Используйте временную таблицу:

CREATE TABLE #variables 
    (
    VarName VARCHAR(20) PRIMARY KEY, 
    Value VARCHAR(255) 
    ) 
GO 

Insert into #variables Select 'Bob', 'SweetDB' 
GO 

Select Value From #variables Where VarName = 'Bob' 
GO 

DROP TABLE #variables 
go 
+10

отличный ответ ... вы на самом деле ОТВЕТЛИ ВОПРОС, а не работали. –

2

вы могли бы использовать динамический SQL, просто быть в курсе угроз безопасности с этим (не уверен на 100% на правильно Syntex)

объявить @bob NVARCHAR (50)

declare @sql nvarchar(max) 
set @bob='SweetDB' 
set @sql = 'Use ' + @bob 

execute sp_executesql @sql 
+0

Я знаю, что это старый ответ, но вполне может прийти в поисках. Когда оператор выполняет и управление возвращается вызывающей процедуре, вы все равно будете использовать базу данных, в которой вы были, перед выполнением динамического выражения «use». Поэтому это не следует путать как способ фактического изменения текущей базы данных. – Storm

12

Я предпочитаю this ответ от этого вопроса Global Variables with GO

который имеет дополнительное преимущество, будучи в состоянии сделать то, что вы изначально хотели сделать, как хорошо.

Предостережение заключается в том, что вам необходимо включить режим SQLCMD (в Query-> SQLCMD) или включить его по умолчанию для всех окон запросов (Инструменты-> Параметры, а затем Результаты запроса-> По умолчанию, открыть новые запросы в SQLCMD режим)

Затем вы можете использовать следующий тип кода (полностью сорван с тем же ответа на Oscar E. Fraxedas Tormo)

--Declare the variable 
:setvar MYDATABASE master 
--Use the variable 
USE $(MYDATABASE); 
SELECT * FROM [dbo].[refresh_indexes] 
GO 
--Use again after a GO 
SELECT * from $(MYDATABASE).[dbo].[refresh_indexes]; 
GO 
+0

Я перенаправлял вывод запроса в другой файл (: out filename) в режиме SQLCMD, и чтобы получить вывод, сброшенный в файл, вы должны выполнить GO, так что это: синтаксис setvar необходим для замены обычных переменных в этой ситуации, поскольку вы «заставили разделить вещи на партии. – Anssssss

0

Если вы используете SQL Server вы можете настроить глобальные переменные для целых сценариев, таких как:

:setvar sourceDB "lalalallalal" 

и использовать позже в сценариях как:

$(sourceDB) 

Сделать режим уверена SQLCMD находится на сервере в Managment Studi, вы можете сделать это с помощью верхнего меню Нажмите Query и переключение SQLCMD режима на.

Еще на тему можно найти здесь: MS Documentation

1

таблицы Temp сохраняются в течение отчетности GO, так что ...

SELECT 'value1' as variable1, 'mydatabasename' as DbName INTO #TMP 

-- get a variable from the temp table 
DECLARE @dbName VARCHAR(10) = (select top 1 #TMP.DbName from #TMP) 
EXEC ('USE ' + @dbName) 
GO 

-- get another variable from the temp table 
DECLARE @value1 VARCHAR(10) = (select top 1 #TMP.variable1 from #TMP) 

DROP TABLE #TMP 

Это не красиво, но это работает

Смежные вопросы