2011-11-21 93 views
4

我有一個存儲過程應該能夠在我的MS Sql服務器上的任何數據庫的任何表上執行。 EXEC和USE語句的大部分組合沒有任何結果。這裏是存儲過程:如何爲另一個數據庫執行存儲過程?

CREATE PROCEDURE [dbo].[usp_TrimAndLowerCaseVarcharFields] 
(
    @Database VARCHAR(200), 
    @TableSchema VARCHAR(200), 
    @TableName VARCHAR(200) 
) 
AS 
BEGIN 
    DECLARE @sSql VARCHAR(MAX) 

    SET @Database = '[' + @Database + ']' 
    SET @sSql = '' 

    -- Create first part of a statement to update all columns that have type varchar 
    SELECT @sSql = @sSql + COLUMN_NAME + ' = LOWER(RTRIM(' + COLUMN_NAME + ')), ' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE DATA_TYPE = 'varchar' 
    AND TABLE_CATALOG = @Database 
    AND TABLE_SCHEMA = @TableSchema 
    AND TABLE_NAME = @TableName 

    SET @sSql = 'UPDATE ' + @Database + '.' + @TableSchema + '.' + @TableName + ' SET ' + @sSql 

    -- Delete last two symbols (', ') 
    SET @sSql = LEFT(@sSql, LEN(@sSql) - 1) 

    EXEC(@sSql) 
END 

請給我建議我在[OtherDB]上執行它[[TargetTable]]。

回答

12

您可以完全限定表和存儲過程。換句話說,你可以這樣做:

UPDATE [OtherDB].[Schema].[targetTable] SET ... 

看來你是在你的proc中這樣做。

您還可以使用完全限定的名稱來執行存儲過程 - 例如,

EXEC [OtherDB].[dbo].[usp_TrimAndLowerCaseVarcharFields] 

老實說,你的proc看起來不錯,你是否收到任何錯誤信息?如果是這樣,請發佈它們。另外,請確保您的用戶有權訪問其他數據庫。

+0

'EXEC'還支持'爲對鏈接服務器運行命令AT'。 –

+0

和4部分命名例如exec [linkedserver]。[database]。[schema]。[proc] –

2

您使用的查詢中的表名是錯誤的,它查找到相同的數據庫,但您確實需要從不同的數據庫中查找。因此,該查詢將如下所示:如果你想使用[TargetDB]動態,那麼你需要生成SQL(@sSql

SELECT @sSql = @sSql + COLUMN_NAME + ' = LOWER(RTRIM(' + COLUMN_NAME + ')), ' 
FROM [TargetDB].INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'varchar' 
AND TABLE_CATALOG = @Database 
AND TABLE_SCHEMA = @TableSchema 
AND TABLE_NAME = @TableName 

-- [TargetDB] = @Database 

的TargetDB將與您通過數據庫(@Database)

)並執行sql字符串。

0

在這種情況下,我sugest使用2級SP的SQL Server中:

  • sp_MSforeachtable

  • sp_MSforeachdb

瞭解更多信息,請閱讀here文章。 希望得到這個幫助。

exec @RETURN_VALUE=sp_MSforeachtable @command1, @replacechar, @command2, 
    @command3, @whereand, @precommand, @postcommand 

exec @RETURN_VALUE = sp_MSforeachdb @command1, @replacechar, 
    @command2, @command3, @precommand, @postcommand 

完整的腳本:

declare @DatabaseName varchar(max), @DatabaseCharParam nchar(1) 
declare @TableSchema varchar(max) 
declare @TableName varchar(max), @TableCharParam nchar(1) 
set @DatabaseName='DATABASENAME'; set @DatabaseCharParam='?' 
set @TableSchema='dbo' 
set @TableName='TABLENAME'; set @TableCharParam='$' 


-- Exemple Script to execute in each table in each database 
-- Create first part of a statement to update all columns that have type varchar 
    DECLARE @sSql VARCHAR(MAX) 
    set @sSql='' 
    SELECT @sSql = isnull(@sSql,'') + COLUMN_NAME + ' = LOWER(RTRIM(' + COLUMN_NAME + ')),' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE DATA_TYPE = 'varchar' 
    AND TABLE_CATALOG = @DatabaseName 
    AND TABLE_SCHEMA = @TableSchema 
    AND TABLE_NAME = @TableName 



declare @EachTablecmd1 varchar(2000) 
--Prepare @EachTablecmd1 the script to execution in each table using sp_MSforeachtable (ATENTION: @Command1 are limited to varchar(2000)) 
    --in sp_MSforeachtable @TableCharParam will be subtituted with owner i.e:[dbo].[TABLENAME] 
set @sSql='update '[email protected]+' set '+ left(@sSql,LEN(@sSql)-1) 
set @EachTablecmd1='if '''''+ @TableCharParam +'''''=''''['[email protected]+'].['[email protected]+']'''' '[email protected] 
    --i.e.: if 'table1'='table1' update table1 set column1=LOWER(RTRIM(column1)),.... 

-- the @sSql for each table in a database 
set @sSql ='exec sp_MSforeachtable @command1='''[email protected]+''' ,@replacechar='''[email protected]+'''' 



declare @EachBDcmd1 varchar(2000) 
--Prepare the execution to each database using sp_MSforeachdb (ATENTION: @Command1 are limited to varchar(2000)) 
set @EachBDcmd1='if '''[email protected]+'''='''[email protected]+''' '+ @sSql 
--print @EachBDcmd1 
exec sp_MSforeachdb @[email protected],@[email protected] 
相關問題