使用SQL查询选择特定成员资格配置文件属性的值

时间:2014-05-16 19:36:34

标签: asp.net sql-server asp.net-membership membership-provider

虽然这应该是一个常见的问题,但我在Google中并没有找到太多相关内容。 我正在使用ASP.NET成员资格,并在aspnet_Profile表中的PropertyValuesString字段中保存所有用户属性。

现在,我希望按特定属性值搜索用户,但使用SQL查询。什么是最佳表现方法?

1 个答案:

答案 0 :(得分: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)-@fieldNameStart)



-- 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