Как использовать имя базы данных в процедуре - PullRequest
0 голосов
/ 06 октября 2011

Я создал процедуру, которая будет выводить сценарий INSERT для данного имени таблицы.И в процедуре я использую этот код:

DECLARE @owner VARCHAR(20) ,
    @Database VARCHAR(50)

SELECT  @owner = 'dbo' ,
        @Database = 'Asmin'

 SELECT   sc.name
   FROM     sysobjects so
            INNER JOIN syscolumns sc ON so.id = sc.id
            INNER JOIN systypes st ON sc.xtype = st.xusertype
   WHERE    so.Name = 'Acisd'

Но проблема, которую я вижу, заключается в том, что процедура находится в базе данных коллекции, а таблица Acisd находится в другой базе данных.Поэтому он ничего не возвращает мне, когда я выполняю процедуру.

Как это исправить?

Ответы [ 5 ]

2 голосов
/ 06 октября 2011

Не совсем уверен, что вы собираетесь здесь, но вы можете указать весь этот оператор для другой базы данных, полностью квалифицировав ссылки на таблицы.

SELECT   sc.name
   FROM     OtherDatabase.dbo.sysobjects so
            INNER JOIN OtherDatabase.dbo.syscolumns sc ON so.id = sc.id
            INNER JOIN OtherDatabase.dbo.systypes st ON sc.xtype = st.xusertype
   WHERE    so.Name = 'Acisd'
1 голос
/ 06 октября 2011

Чтобы сделать это внутри хранимой процедуры, вам нужно использовать динамический SQL.Например:

declare @sql nvarchar(max);
set @sql = N'SELECT   sc.name
      FROM ' + quotename(@dbanme) + N'.sys.objects so
      INNER JOIN ' + quotename(@dbname) + N'sys.columns sc ON so.id = sc.id
      INNER JOIN ' + quotename(@dbname) + N'sys.types st ON sc.xtype = st.xusertype
      WHERE so.Name = @objectName';
exec sp_executesql @sql, N'@objectName sysname', @objectName;
0 голосов
/ 07 октября 2011

В sybase есть функция db_name () для вывода текущей базы данных ... не уверен насчет sqlserver

0 голосов
/ 06 октября 2011

Как сказал предыдущий, самый простой способ сделать это - просто начать с

USE [otherDatabasename]

GO

ОБЪЯВИТЬ @ владелец VARCHAR (20), @Database VARCHAR (50)

SELECT @owner = 'dbo', @Database = 'Asmin'

SELECT sc.name ОТ СИСОБЪЕКТОВ так ВНУТРЕННЕЕ СОЕДИНЕНИЕ syscolumns sc ON so.id = sc.id ВНУТРЕННИЕ СОЕДИНЕНИЯ systypes st ON sc.xtype = st.xusertype ГДЕ так. Имя = 'Acisd'

0 голосов
/ 06 октября 2011

В MySQL есть предложение «Use», которое может предшествовать любому оператору select. Я считаю, что это также имеет место в SQL-сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...