使用select * sys.synonyms和case语句时删除并创建同义词

时间:2014-06-27 19:42:06

标签: sql-server tsql

我使用以下代码删除并在我的数据库中创建同义词。

select * from sys.synonyms

DROP SYNONYM DATABASE1.BTXADDR;
DROP SYNONYM DATABASE1.BTXSUPB;
CREATE SYNONYM DATABASE1.BTXADDR FOR
  DATABASE2.DA2.BTXADDR;  
CREATE SYNONYM DATABASE1.BTXSUPB FOR
 DATEBASE2.DA3.BTXSUPB;

TRUNCATE TABLE DATABASE2.DA2.BTXADDR;
TRUNCATE TABLE DATABASE2.DA3.BTXSUPB;
INSERT INTO DATABASE2.DA3.BTXSUPB SELECT * FROM DATABASE2.DA2.BTXSUPB;

我遇到的问题是我有不同的文件夹,我希望同义词指向。文件夹是DA1,DA2,DA3。 DA的同义词,指向DA1。但我希望有一个if then语句,查看当前指向的位置,然后将指针更改为DA2,然后将DA3更改为DA3,然后在需要更改时返回DA1。

我在这里阅读了很多帖子,我可以自己更改同义词。但是为了节省我的时间,我需要改变它。

1 个答案:

答案 0 :(得分:0)

这就是我需要做的事情并使其更加轻松。

DECLARE @synName VARCHAR(100), @synTarget VARCHAR(150)

DECLARE Syns CURSOR FOR
SELECT  base_object_name
  FROM sys.synonyms 
  where name in ('BTXADDR', 'BTXSUPB') 
OPEN Syns
FETCH NEXT FROM Syns INTO @synName, @synTarget
WHILE @@FETCH_STATUS <> -1
BEGIN
 PRINT 'DROP SYNONYM ' + @synName
 SET @synTarget = CASE 
                   WHEN @synTarget LIKE '%[DA2]%' THEN REPLACE(@synTarget,'[DA2]','[DA3]')
                   WHEN @synTarget LIKE '%[DA3]%' THEN REPLACE(@synTarget,'[DA3]','[DA1]')
                   WHEN @synTarget LIKE '%[DA1]%' THEN REPLACE(@synTarget,'[DA1]','[DA2]')
              END
 PRINT 'CREATE SYNONYM ' + @synName + ' FOR ' +@synTarget
 FETCH NEXT FROM Syns INTO @synName, @synTarget
END
CLOSE Syns
DEALLOCATE Syns

我发布了我想出的内容,以免其他人遇到同样的问题,然后他们就不必经历我遇到的麻烦。