【发布时间】:2015-07-24 11:21:44
【问题描述】:
我的应用程序运行在多个数据库上,它需要能够从一个数据库中检查一个列是否存在于另一个数据库中。不幸的是,直到运行时我才知道第二个数据库的名称,所以它需要是动态的。此外,它必须在多个地方执行此操作,所以理想情况下我想将它变成一个函数,但这给我带来了问题,因为函数不会运行动态 SQL。
这是我写的(不工作的)函数.....
CREATE FUNCTION [dbo].[fn_checkcolexists] (
@dbname VARCHAR(100)
,@tablename VARCHAR(100)
,@colname VARCHAR(100)
)
RETURNS BIT
AS
BEGIN
DECLARE @sqlstring NVARCHAR(2000)
SET @sqlstring = 'select @retVal = 1 from ' + @dbname + '.sys.columns cols inner join yodata_dev_load.sys.tables tabs
on cols.object_ID=tabs.object_ID where cols.name=''' + @colname + ''' and tabs.name=''' + @tablename + ''''
DECLARE @retVal INT
EXEC sp_executesql @sqlstring
,N'@retVal int output'
,@retVal OUTPUT
RETURN @retval
END
有没有人对我如何做到这一点提出任何建议?我找不到访问每个数据库的列信息的方法。这些信息是否存在于任何地方的系统数据库中?
或者,我可以为其他数据库创建某种同义词吗?
编辑:How to find column names for all tables in all databases in SQL Server 不是一个理想的解决方案,因为它还依赖于动态 SQL,所以我不能将其用作函数
【问题讨论】:
-
这是 SQL Server,对吧?
-
抱歉,应该这样说。是的 SQL 2012
-
这取决于您使用的 DBMS,对于 sql server,列是 dbname.INFORMATION_SCHEMA.COLUMNS,表是 dbname.INFORMATION_SCHEMA.TABLES。
-
它们不只在数据库级别工作吗?我需要所有数据库上所有列的列表
-
How to find column names for all tables in all databases in SQL Server 的可能副本。无论如何要注意dynamic sql is not allowed inside a udf,所以你最好寻找一种不同的方法(想到存储过程或clr)
标签: sql sql-server