1

以下のような varchar 値があります

72,73,74

Id をUser Tableと一致させたいのですが、上記の値をintに変換した後、コンマとして分割しようとしました。

CREATE FUNCTION Fn_MyFunction(@MyUserIdValues VARCHAR(100))  
RETURNS VARCHAR(300) AS  
BEGIN 

DECLARE @Result VARCHAR(300) = ''

Select UserName From UserTable
Where MyUserIdValues=UserIdValues


RETURN @Result 

@Result は、1 つの列で以下のようにする必要があります

Joe,Michael,Ricky

どんな助けでも大歓迎です。

ありがとう。

4

6 に答える 6

0

これをチェックしてください、それはあなたの問題を解決し、シンプルで完璧な方法です

  Select Username from UserTable where MyUserIdValues IN ' + '('+ @Id +')'
于 2013-10-03T06:28:09.720 に答える
0

文字列を分割してテーブルに挿入するための解決策を見つけました

GO
/****** Object:  UserDefinedFunction [dbo].[Split]    Script Date: 10/03/2013 11:45:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[Split] (
      @InputString                  VARCHAR(8000),
      @Delimiter                    VARCHAR(50)
)

RETURNS @Items TABLE (
      Item                          int
)

AS
BEGIN
      IF @Delimiter = ' '
      BEGIN
            SET @Delimiter = ','
            SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
      END

      IF (@Delimiter IS NULL OR @Delimiter = '')
            SET @Delimiter = ','



      DECLARE @Item                 VARCHAR(8000)
      DECLARE @ItemList       VARCHAR(8000)
      DECLARE @DelimIndex     INT

      SET @ItemList = @InputString
      SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
      WHILE (@DelimIndex != 0)
      BEGIN
            SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
            INSERT INTO @Items VALUES (@Item)

            -- Set @ItemList = @ItemList minus one less item
            SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
            SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
      END -- End WHILE

      IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
      BEGIN
            SET @Item = @ItemList
            INSERT INTO @Items VALUES (@Item)
      END

      -- No delimiters were encountered in @InputString, so just return @InputString
      ELSE INSERT INTO @Items VALUES (cast(@InputString as int))

      RETURN

END -- End Function



Select UserName From UserTable where MyUserIdValues in(Select Item from Split('72,73,74',','))

// 最後のクエリを使用して関数 Split を呼び出します

于 2013-10-03T06:19:40.743 に答える
0

私の試み(少しきれいだと思います):

create function dbo.fn_UserNames(@ids varchar(max))
returns varchar(max) as
begin
    set @ids = @ids + ','

    declare @id table (Id int)
    while(@ids != '') begin
        insert into @id 
        select i
          from (select substring(@ids, 1, charindex(',', @ids, 0) - 1) i) a
         where i != ''

        if @ids like '%,%'
            set @ids = substring(@ids, charindex(',', @ids, 0) + 1, 
                       len(@ids) - charindex(',', @ids, 0))
        else
            set @ids = ''
    end

    declare @ret varchar(max)
    select @ret = isnull(@ret, '') + a.UserName + ','
      from adhoc.UserTable   a
      join @id               b  on a.UserId = b.Id

    return @ret
end
于 2013-10-03T06:42:18.657 に答える
0

こんにちは、これも試すことができます。

CREATE FUNCTION [DBO].[FN_SPLIT] ( @STRSTRING VARCHAR(MAX))
RETURNS @NAME TABLE (NAME VARCHAR(MAX))
AS
BEGIN
      DECLARE @USERID TABLE(ID INT)

      DECLARE @USERS TABLE (ID INT , NAME VARCHAR(50))
      INSERT INTO @USERS VALUES (72,'A'),(73,'B'),(74,'C')

      ;WITH STR_CTE(_START, _STOP) AS
      (
        SELECT  1, CHARINDEX(',' , @STRSTRING )
        UNION ALL
        SELECT  CAST(_STOP + 1 AS INT), CHARINDEX(',' ,@STRSTRING  , CAST((_STOP + 1) AS INT))
        FROM
            STR_CTE
        WHERE _STOP > 0
      )

      INSERT INTO @USERID (ID)     
      SELECT
            SUBSTRING(@STRSTRING , _START, CASE WHEN _STOP > 0 THEN _STOP -_START ELSE 4000 END) AS ID
      FROM STR_CTE

      DECLARE @STRNAME VARCHAR(MAX)
      SELECT
            @STRNAME = COALESCE(@STRNAME+',','') + U.NAME
      FROM
            @USERID UD
      INNER JOIN
            @USERS U ON UD.ID = U.ID

      INSERT INTO @NAME
      SELECT @STRNAME

      RETURN;
END
于 2013-10-03T15:27:18.003 に答える