我要创建一个函数来读取包含大约65个表的表,并查找包含日期的所有列,这些列主要存储为int,有时作为char或datetime存储。列名称未知但我假设以'%Date'结尾。
我需要根据他/她的SSN找到MAX即每个客户的最新日期。但是,SSN也称为不同的名称,例如SSN,SSN_Nr,SSN_No等。下面我的代码是绝对错误的:
CREATE FUNCTION dbo.LastActivityDate (@SSN varchar(10))
RETURNS datetime
AS
BEGIN
DECLARE @Result datetime
DECLARE @SSN varchar(10)
DECLARE @tableSSN varchar(10)
DECLARE @table varchar(100)
DECLARE @column_name nvarchar(100)
DECLARE @tableDate datetime
DECLARE @LastActivityDate datetime
SET @column_name='%DATE' --only ends in date, so as not to pick up 'update_office',etc
if @SSN IS NULL OR @SSN = '' OR @SSN = ' '
begin
BREAK
end
else
begin
WHILE select Table_Name,Field1 from dbo.MERGE_TABLES where [Enabled]='Y' AND Field1=@SSN
BEGIN
SET @table = Table_Name
SET @tableSSN = Field1
declare @column_name nvarchar(100)
set @table = 'e_client'
set @column_name='%DATE' --only ends in date, so as not to pick up 'update_office',etc
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=@table AND column_name LIKE @column_name ORDER BY ordinal_position
IF ISDATE(SELECT .... FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=@table AND column_name LIKE @column_name)=1
begin
CONVERT(datetime,(SELECT .... FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=@table AND column_name LIKE @column_name))
end
.
.
.
IF (Select MAX([@tableDate]) from @table where @tableSSN=@SSN) > @LastActivityDate --column like FinishDate, proposedFinishDate or startdate if finish is empty
begin
@LastActivityDate=@tableDate
end
END
end--@SSN
SET @Result=@LastActivityDate
RETURN @Result
END
GO
答案 0 :(得分:3)
有些问题需要自动化。我不认为这是其中之一。
我不相信一个脚本可以在这个数据库中正确使用它。我认为您应该查看每个表,并通过眼睛确定哪些列包含日期以及哪些列包含SSAN。即使你花了5分钟一桌,这仍然不到一天的工作。
如果你必须再次这样做,那么你可以根据你对表和列的新发现的知识自动化它。
如果您在这里工作,可以使用文本工具查找所有SSAN列,因为它们都基于CREATE DOMAIN
语句,如(PostgreSQL)
CREATE DOMAIN SSAN AS CHAR(9) CHECK (VALUE ~ '^\\d{9}$');
CREATE TABLE users (
user_id INTEGER PRIMARY KEY,
ssan SSAN NOT NULL UNIQUE, -- These *are* unique where I work. YMMV.
...
);