1

일반적인 질문이지만 Google에서이 항목에 대해 많이 알지 못했습니다. ASP.NET 멤버십을 사용하고 aspnet_Profile 테이블의 PropertyValuesString 필드에 모든 사용자 속성을 저장하고 있습니다.SQL 쿼리를 사용하여 특정 회원 프로필 속성 값 선택

이제 SQL 쿼리를 사용하여 특정 속성 값으로 사용자를 검색하려고합니다. 최상의 성능 현명한 접근 방식은 무엇입니까?

답변

3

asp_profile 항목은 이와 같은 문자열 연결 해킹 작업으로 매우 어렵습니다.

하지만 여기 있습니다.

http://www.karpach.com/Get-asp-net-profile-value-MS-SQL-database-using-T-SQL.htm

나는 죽은 링크 문제를 방지하기 위해 여기에 코드를 붙여 넣습니다 것입니다. 그러나 읽을만한 가치가있는 의견이 있기 때문에 링크도 확인하십시오.

ASP.Net profiles can store binary data as well, but usually your are interested in string data such as First and Last names. First lets create helper function, which helps to get position:length pair values: 

CREATE FUNCTION dbo.fn_GetElement 

(

@ord AS INT, 

@str AS VARCHAR(8000), 

@delim AS VARCHAR(1)) 



RETURNS INT 

AS 

BEGIN 

    -- If input is invalid, return null. 

    IF @str IS NULL 

     OR LEN(@str) = 0 

     OR @ord IS NULL 

     OR @ord < 1 

     -- @ord > [is the] expression that calculates the number of elements. 

     OR @ord > LEN(@str) - LEN(REPLACE(@str, @delim, '')) + 1 

    RETURN NULL 

    DECLARE @pos AS INT, @curord AS INT 

    SELECT @pos = 1, @curord = 1 

    -- Find next element's start position and increment index. 

    WHILE @curord < @ord 

    SELECT 

     @pos = CHARINDEX(@delim, @str, @pos) + 1, 

     @curord = @curord + 1 

    RETURN 

    CAST(SUBSTRING(@str, @pos, CHARINDEX(@delim, @str + @delim, @pos) - @pos) AS INT) 

END 



And then code for the actual worker function: 

CREATE FUNCTION dbo.fn_GetProfileElement 

(

@fieldName AS NVARCHAR(100), 

@fields AS NVARCHAR(4000), 

@values AS NVARCHAR(4000)) 



RETURNS NVARCHAR(4000) 

AS 

BEGIN 

    -- If input is invalid, return null. 

    IF @fieldName IS NULL 

     OR LEN(@fieldName) = 0 

     OR @fields IS NULL 

     OR LEN(@fields) = 0 

     OR @values IS NULL 

     OR LEN(@values) = 0 



    RETURN NULL 



-- locate FieldName in Fields 

DECLARE @fieldNameToken AS NVARCHAR(20) 

DECLARE @fieldNameStart AS INTEGER, 

@valueStart AS INTEGER, 

@valueLength AS INTEGER 



-- Only handle string type fields (:S:) 

SET @fieldNameStart = CHARINDEX(@fieldName + ':S',@Fields,0) 



-- If field is not found, return null 

IF @fieldNameStart = 0 RETURN NULL 

SET @fieldNameStart = @fieldNameStart + LEN(@fieldName) + 3 



-- Get the field token which I've defined as the start of the 

-- field offset to the end of the length 

SET @fieldNameToken = SUBSTRING(@Fields,@fieldNameStart,LEN(@Fields)[email protected]) 



-- Get the values for the offset and length 

SET @valueStart = dbo.fn_getelement(1,@fieldNameToken,':') 

SET @valueLength = dbo.fn_getelement(2,@fieldNameToken,':') 



-- Check for sane values, 0 length means the profile item was 

-- stored, just no data 

IF @valueLength = 0 RETURN '' 



-- Return the string 

RETURN SUBSTRING(@values, @valueStart+1, @valueLength) 



END 



Now we can get first name and last name as following: 



SELECT dbo.fn_GetProfileElement('FirstName',PropertyNames,PropertyValuesString) + ' ' + 



dbo.fn_GetProfileElement('LastName',PropertyNames,PropertyValuesString) as FullName FROM aspnet_Profile 
+0

Ooops, 반복되는 질문 일 수 있습니다. http://stackoverflow.com/questions/7315284/sql-aspnet-profile – granadaCoder

+0

대단히 감사합니다! 문제를 해결했습니다. 다른 질문에 관해서는, 불행히도 제목은 대답에 대한 질문에 대해 많이 말하지 않습니다. – Lamar