我的应用程序在几个数据库上运行,它需要能够从一个数据库进行检查,以查看另一个列中是否存在列。不幸的是,直到运行时我才知道第二个数据库的名称,所以它需要是动态的。此外,它必须在多个地方执行此操作,因此理想情况下我希望将其转换为函数,但这会给我带来问题,因为函数不会运行动态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,因此我无法将其用作函数
答案 0 :(得分:0)
使用存储过程并使用其中一个
其中一种方法是使用未记录的
f(&n)
或模拟它
EXEC sp_msforeachdb 'SELECT table_catalog FROM ?.INFORMATION_SCHEMA.COLUMNS
where table_name=''your_table'' and column_name=''your_column_name'''
答案 1 :(得分:0)
我想我已经得到了我追求的解决方案。我正在使用COL_LENGTH,它似乎可以完成这项工作。您可以将dbname指定为is,甚至将其作为参数传递,如果该列不存在,则返回null。
例如
声明@dbname varchar(200)='dbname'
选择COL_LENGTH(@dbname +'。dbo.tablename','columnname')
如果返回null,则该列不存在
非常感谢这个主题的所有贡献者
答案 2 :(得分:0)
希望这适合你
CREATE FUNCTION [dbo].[fn_checkcolexists]
(
@dbname VARCHAR(100)
,@tablename VARCHAR(100)
,@colname VARCHAR(100)
)
RETURNS INT
AS
BEGIN
DECLARE @RECCOUNT INT = 0
SELECT @RECCOUNT = COUNT(*) FROM information_schema.columns WHERE TABLE_CATALOG = @dbname AND COLUMN_NAME = @colname AND TABLE_NAME = @tablename
RETURN @RECCOUNT
END
GO