Đối với những người vẫn đang tìm kiếm một phương pháp để phân tích bảng aspnet_Profile sử dụng SQL tinh khiết. Đây là những gì tôi sử dụng:
Trước tiên, bạn cần một bảng Tally. Nếu bạn không biết điều này là gì, đọc bài viết này bởi Jeff Moden: http://www.sqlservercentral.com/articles/T-SQL/62867/
Đối với bạn để tạo ra việc sử dụng bảng tổng sắp kịch bản này:
SELECT TOP 11000 IDENTITY(INT,1,1) AS N INTO dbo.Tally FROM Master.dbo.SysColumns sc1, Master.dbo.SysColumns sc2
--===== Add a Primary Key to maximize performance
ALTER TABLE dbo.Tally ADD CONSTRAINT PK_Tally_N PRIMARY KEY CLUSTERED (N) WITH FILLFACTOR = 100
--===== Let the public use it
GRANT SELECT, REFERENCES ON dbo.Tally TO PUBLIC
Bây giờ trên để phân tích các ProfileData: Quá trình này dưới đây là cách nhanh nhất tôi tìm thấy để thực hiện việc này sau nhiều lần thử nghiệm trên dữ liệu cụ thể của tôi. Tôi đã thử nghiệm phân tích cú pháp bảng đầy đủ trong một lần, nhưng chạy chậm hơn so với sử dụng hàm bên dưới và phân tích cú pháp một người dùng tại một thời điểm với một ứng dụng CROSS.
Vì vậy, để gọi hàm, sử dụng một cái gì đó như:
SELECT bla, bla
FROM aspnet_Users u CROSS APPY dbo.ProfileProperties(u.UserID)
Điều duy nhất bạn cần làm là để cập nhật 3 điều cần chứa Properties hồ sơ mà bạn sử dụng: 1) bảng trở 2) tuyên bố PIVOT và 3) câu lệnh chèn sao chép dữ liệu từ PIVOT vào bảng trả lại
Đây là chức năng, Hãy tận hưởng!
/** =============================================
** Author: Francois Grobler
** Create date: 2013-04-25
** Description: This function extracts all
** Profile Properties for a given UserId,
** and returns them as a table
** Change History:
** Date: Author: Change:
**
** ============================================= **/
CREATE FUNCTION dbo.ProfileProperties
(
@UserID UNIQUEIDENTIFIER
)
RETURNS @returnTable TABLE(
FirstName nvarchar(200)
, LastName nvarchar(200)
, PassportNumber nvarchar(100)
, PositionCode int
, CellNumber nvarchar(20)
, Telephone nvarchar(30)
, FaxNumber nvarchar(20)
, Email nvarchar(200)
, PersalNumber nvarchar(10)
, SouthAfricanIdentityNumber nchar(13)
, ContractNumber nvarchar(20)
, DepartmentName nvarchar(200)
, SiteName nvarchar(200)
, DepartmentCode int
, SiteCode int
, UserAccessCode int
, ApproverCode int
)
WITH SCHEMABINDING
AS
BEGIN
WITH Properties(PropertyNo, PropertyType, UserId, Value)
AS
(
SELECT (ROW_NUMBER() OVER(ORDER BY UserId) - 1)/4 PropertyNo
, (ROW_NUMBER() OVER(PARTITION BY p.UserId ORDER BY UserId) - 1) % 4 PropertyType
, p.UserId
, SUBSTRING(':' + CONVERT(nvarchar(4000), p.PropertyNames), n + 1, CHARINDEX(':', ':' + CONVERT(nvarchar(4000), p.PropertyNames), n + 1) - n - 1) Value
FROM dbo.Tally, dbo.aspnet_Profile p
WHERE n < LEN(':' + CONVERT(nvarchar(4000), p.PropertyNames))
and SUBSTRING(':' + CONVERT(nvarchar(4000), p.PropertyNames), n, 1) = ':'
and p.UserId = @UserID
)
, FlatProperties(UserId, Property, ValueType, StartIndex, ValueLength)
AS
(
SELECT UserId
, MAX(CASE WHEN PropertyType = 0 THEN Value ELSE '' END) Property
, MAX(CASE WHEN PropertyType = 1 THEN Value ELSE '' END) ValueType
, MAX(CASE WHEN PropertyType = 2 THEN CONVERT(int, Value) + 1 ELSE 0 END) StartIndex
, MAX(CASE WHEN PropertyType = 3 THEN CONVERT(int, Value) ELSE 0 END) ValueLength
FROM
Properties
GROUP BY UserID, PropertyNo
)
, PropertyValues(UserID, PropertyName, PropertyValue)
AS
(
SELECT p.UserID, fp.Property
, CASE fp.ValueType
WHEN 'S' THEN SUBSTRING(p.PropertyValuesString, fp.StartIndex, fp.ValueLength)
ELSE SUBSTRING(p.PropertyValuesBinary, fp.StartIndex, fp.ValueLength) END Value
FROM dbo.aspnet_Profile p INNER JOIN flatProperties fp ON p.UserId = fp.UserId
WHERE p.UserId = @UserID
)
, PropertyTable
AS
(
SELECT
UserID
, pvt.[FirstName]
, pvt.[LastName]
, pvt.[PassportNumber]
, pvt.[PositionCode]
, pvt.[CellNumber]
, pvt.[Telephone]
, pvt.[FaxNumber]
, pvt.[Email]
, pvt.[PersalNumber]
, pvt.[SouthAfricanIdentityNumber]
, pvt.[ContractNumber]
, pvt.[DepartmentName]
, pvt.[SiteName]
, pvt.[DepartmentCode]
, pvt.[SiteCode]
, pvt.[UserCode] UserAccessCode
, pvt.[ApproverCode]
FROM PropertyValues
PIVOT (
MAX(PropertyValue) FOR PropertyName IN ([FirstName],[LastName],[PassportNumber],[PositionCode],[CellNumber],[Telephone],[FaxNumber],[Email],[PersalNumber],[SouthAfricanIdentityNumber],[ContractNumber],[DepartmentName],[SiteName],[DepartmentCode],[SiteCode],[UserCode],[ApproverCode])
) AS pvt
)
INSERT INTO @returnTable
(
FirstName
, LastName
, PassportNumber
, PositionCode
, CellNumber
, Telephone
, FaxNumber
, Email
, PersalNumber
, SouthAfricanIdentityNumber
, ContractNumber
, DepartmentName
, SiteName
, DepartmentCode
, SiteCode
, UserAccessCode
, ApproverCode
)
SELECT TOP 1
FirstName
, LastName
, PassportNumber
, PositionCode
, CellNumber
, Telephone
, FaxNumber
, Email
, PersalNumber
, SouthAfricanIdentityNumber
, ContractNumber
, DepartmentName
, SiteName
, DepartmentCode
, SiteCode
, UserAccessCode
, ApproverCode
FROM PropertyTable;
RETURN;
END
GO
Cảm ơn Marek, đây là một smaple hàng: UserID: 06b24b5c-9aa1-426e-b7e4-0771c5f85e85 \t Tên sản phẩm: MobilePho ne: S: 0: 0: Initials: S: 0: 1: Thành phố: S: 1: 14: FirstName: S: 15: 6: PostalCode: S: 21: 7: WorkPhone: S: 28: 12: Họ: S: 40: 5: Address1: S: 45: 17: Address2: S: 62: 0: Tỉnh: S: 62: 2: Tổ chức: S: 64: 4: ClinicId: S: 68: 1: Quốc gia: S: 69: 6: Fax: S: 75: 0: MSPNumber: S: 75: 0: \t PropertyValuesSring: HEast HustonEASGeorgeT7D 1N8604-111-2222Test5555 Beddtvue AveDCHCNL2Canada \t (FirstName là George, LastName là Test) PropertyVlaueBinary: \t LastUpdateDate: 2010-01-02 22: 22: 03.947 –
hncl
Cách thông tin được mã hóa trong bảng 'aspnet_Profile' (http://msdn.microsoft.com/en-us/library/aa478953.aspx) là chính xác tại sao tôi đã chọn không sử dụng nó và tạo ra một bảng tùy chỉnh để lưu trữ thông tin hồ sơ. Bạn có thể cho chúng tôi biết thêm về vấn đề của bạn không? Bạn có cần tạo báo cáo hiển thị tất cả họ và tên ** hay ** bạn có cần truy xuất họ và tên cho một người dùng không? –
Chỉ cần truy xuất tên và họ của một người dùng, sử dụng userid. Cảm ơn – hncl