如何遍历已知表和未知列以获得每个SSN的MAX日期?

时间:2011-10-03 08:05:43

标签: sql sql-server-2008

我要创建一个函数来读取包含大约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

1 个答案:

答案 0 :(得分:3)

  • 您有一个未记录的数据库。
  • 您不知道列名。
  • 您不知道哪些列包含日期。
  • 使用至少三种不同的数据类型存储日期。
  • 您不知道哪些列包含SSAN。
  • 列名称不一致。

有些问题需要自动化。我不认为这是其中之一。

我不相信一个脚本可以在这个数据库中正确使用它。我认为您应该查看每个表,并通过眼睛确定哪些列包含日期以及哪些列包含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.
    ...
);