问题描述
我试着找
最后我用这种方式
0- 由于视图中的字段别名,我试图查找列的真实名称。所以我用了这个功能
Create FUNCTION [dbo].[_D_RealColumnName]
(@ViewName NVarChar(50),@ColumnName NVarChar(50))RETURNS NVarChar(50)
AS BEGIN
DECLARE @R NVarchar(50)
Set @R=(SELECT name
FROM sys.dm_exec_describe_first_result_set
(N'SELECT * from '+@ViewName,null,1)
Where source_column=@ColumnName)
RETURN IsNUll(@R,@ColumnName )
END
1- 创建一个视图来收集名为“[_I_AllFields]”的信息
CREATE View [dbo].[_I_AllFields] as
SELECT *
FROM (SELECT T .TABLE_NAME AS TName,C.COLUMN_NAME AS FName,C.ORDINAL_POSITION AS FSeq,D .value AS FDesc,C.DATA_TYPE AS FType,C.CHaraCTER_MAXIMUM_LENGTH AS FLen,F.collation_name AS Coll,F.is_identity AS IsIdentity,F.is_nullable AS IsNullAble,CONVERT(NVarChar(50),'') VName
FROM informatION_SCHEMA.TABLES AS T INNER JOIN
informatION_SCHEMA.COLUMNS AS C ON C.TABLE_NAME = T .TABLE_NAME INNER JOIN
sys.columns AS F ON F.object_id = OBJECT_ID(T .TABLE_SCHEMA + '.' + T .TABLE_NAME) AND F.name = C.COLUMN_NAME LEFT OUTER JOIN
sys.extended_properties AS D ON D .major_id = F.object_id AND D .minor_id = F.column_id AND D .Name = 'MS_Description') TList
UNION
SELECT VCU.TABLE_NAME TName,[dbo].[_D_RealColumnName](VCU.VIEW_NAME,VCU.COLUMN_NAME) FName,TAF.FSeq,TAF.FDesc,TAF.FType,TAF.FLen,TAF.Coll,IsIdentity,IsNullAble,VCU.VIEW_NAME VName
FROM informatION_SCHEMA.VIEW_COLUMN_USAGE AS VCU INNER JOIN
(SELECT T .TABLE_NAME AS TName,F.is_nullable AS IsNullAble
FROM informatION_SCHEMA.TABLES AS T INNER JOIN
informatION_SCHEMA.COLUMNS AS C ON C.TABLE_NAME = T .TABLE_NAME INNER JOIN
sys.columns AS F ON F.object_id = OBJECT_ID(T .TABLE_SCHEMA + '.' + T .TABLE_NAME) AND F.name = C.COLUMN_NAME LEFT OUTER JOIN
sys.extended_properties AS D ON D .major_id = F.object_id AND D .minor_id = F.column_id AND D .Name = 'MS_Description') TAF ON VCU.TABLE_NAME = TAF.TName AND VCU.COLUMN_NAME = TAF.FName
CREATE
FUNCTION [dbo].[_D_Field](
@InTName VarChar(100)
) RETURNS @Ans Table (
TName VarChar(70),FName VarChar(70),FSeq int,FDesc NVarChar(70),FType NVarChar(10),FLen int
)
AS BEGIN
If Not Object_ID(@InTName,'U') Is Null
Insert into @Ans
SELECT Convert(VarChar(70),TName)TName,Convert(VarChar(70),FName)FName,Convert(Int,FSeq)FSeq,Case When IsNull(FDesc,'')='' Then Convert(VarChar(70),FName)
Else Case When Substring(Convert(VarChar(70),FDesc),1,1)='*' Then Case When Substring(Convert(VarChar(70),2,1)='' Then Convert(VarChar(70),FName)
Else Substring(Convert(VarChar(70),70)End
Else Convert(VarChar(70),FDesc) End End FDesc,FType,IsNull(FLen,0)FLen
FROM _I_AllFields
where TName=@InTName
Else
Insert into @Ans
SELECT Convert(VarChar(70),0)FLen
FROM _I_AllFields
where VName=@InTName
RETURN
END
3- 最后我使用了这个命令
Select * From dbo._D_Field('my_View_Name')
或
Select * From dbo._D_Field('my_Table_Name')
是正确的还是我能找到简单的方法?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)