如何使用传递数据库名称到存储过程

时间:2016-12-13 12:14:04

标签: sql-server stored-procedures

我有一个数据库,我保存所有存储过程和函数'utils'这些对象应该能够从其他数据库中调用。

这是我遇到问题的存储过程

USE [Utils]
GO
/****** Object:  StoredProcedure [dbo].[usp_trim_all_string_columns]    Script Date: 13/12/2016 10:54:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_trim_all_string_columns] @DatabaseName Varchar(100), @SchemaName Varchar(100),@TableName Varchar(100)
AS
BEGIN

DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ',[', '[') +
              COLUMN_NAME + ']=LTRIM(RTRIM([' + COLUMN_NAME + ']))'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @SchemaName AND TABLE_NAME = @TableName AND DATA_TYPE Like '%char%'

SET @SQL = 'UPDATE [' + @SchemaName + '].[' + @TableName + '] SET ' + @SQL

EXEC (@SQL)

END

代码中有一行总是失败

FROM INFORMATION_SCHEMA.COLUMNS

原因是sp属于utils数据库,因此只查找utils模式中存在的列。我需要能够参数化该行,以便我可以传递数据库名称,如此

FROM MYDATABASE.INFORMATION_SCHEMA.COLUMNS

我尝试使用

FROM @DatabaseName.INFORMATION_SCHEMA.COLUMNS

但失败,因为@DatabaseName只是一个字符串

有人帮忙吗?

1 个答案:

答案 0 :(得分:1)

将此SP传播到所有数据库,然后:

dogleg

或将其重写为完全动态的sql,其中DB定义了动态sql。