如何为另一个DB执行存储过程?

Ole*_*rov 6 sql sql-server stored-procedures linked-server

我有一个存储过程应该能够在我的MS Sql Server上的任何数据库的任何表上执行.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
Run Code Online (Sandbox Code Playgroud)

请在[OtherDB]上建议我要做什么来执行它.[TargetTable].

Cod*_*ian 17

您可以完全限定表和存储过程.换句话说,你可以这样做:

UPDATE [OtherDB].[Schema].[targetTable] SET ...
Run Code Online (Sandbox Code Playgroud)

看来你已经在你的过程中这样做了.

您还可以使用完全限定名称来执行存储过程 - 例如

EXEC [OtherDB].[dbo].[usp_TrimAndLowerCaseVarcharFields]
Run Code Online (Sandbox Code Playgroud)

老实说,你的proc看起来很好,你收到任何错误信息吗?如果是这样,请发布它们.此外,请确保您的用户可以访问其他数据库.

  • `EXEC` 还支持 `AT` 来针对链接服务器运行命令。 (3认同)