Per coloro che sono ancora alla ricerca di un metodo per analizzare il tavolo aspnet_Profile utilizzando SQL puro. Ecco quello che io uso:
In primo luogo è necessario un tavolo Tally. Se non sapete di cosa si tratta, leggere questo articolo da Jeff Moden: http://www.sqlservercentral.com/articles/T-SQL/62867/
per voi per generare l'uso tavolo tally questo script:
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
D'ora in poi l'analisi del profileData: Il processo di seguito è il modo più veloce che ho trovato per fare questo dopo un sacco di test sui miei dati specifici. Ho testato l'analisi della tabella completa in una volta sola, ma funziona più lentamente rispetto all'utilizzo della funzione seguente e analizzando un utente alla volta con un'applicazione CROSS.
Quindi, per chiamare la funzione, usare qualcosa come:
SELECT bla, bla
FROM aspnet_Users u CROSS APPY dbo.ProfileProperties(u.UserID)
L'unica cosa che devi fare è aggiornare 3 cose per contenere le proprietà del profilo che si utilizza: 1) la tabella di ritorno 2) la dichiarazione PIVOT, e 3) la dichiarazione dell'inserto di copiare i dati dal perno nella tabella di ritorno
Ecco la funzione, Enjoy!
/** =============================================
** 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
Grazie Marek, ecco uno Smaple riga: UserID: 06b24b5c-9aa1-426e-b7e4-0771c5f85e85 \t PropertyName: MobilePho ne: S: 0: 0: Iniziali: S: 0: 1: Città: S: 1: 14: FirstName: S: 15: 6: CodicePostale: S: 21: 7: WorkPhone: S: 28: 12: Cognome: S: 40: 5: Indirizzo1: S: 45: 17: Indirizzo2: S: 62: 0: Provincia: S: 62: 2: Organizzazione: S: 64: 4: ClinicId: S: 68: 1: Paese: S: 69: 6: Fax: S: 75: 0: MSPNumber: S: 75: 0: \t PropertyValuesSring: HEast HustonEASGeorgeT7D 1N8604-111-2222Test5555 Beddtvue AveDCHCNL2Canada \t (FirstName è George, Cognome è test) PropertyVlaueBinary: \t LastUpdateDate: 2010-01-02 22: 22: 03,947 –
hncl
Il modo in cui le informazioni sono codificate nella tabella 'aspnet_Profile' (http://msdn.microsoft.com/en-us/library/aa478953.aspx) è esattamente perché ho scelto di non usarlo e ho creato una tabella personalizzata per archiviare le informazioni del profilo. Puoi dirci di più sul tuo problema? Devi creare un rapporto che mostri tutti i nomi e i cognomi ** o ** hai bisogno di recuperare nome e cognome per un singolo utente? –
Basta recuperare il nome e il cognome di un singolo utente, usando userid. Grazie – hncl