【问题标题】:StoredProc datatype for list of Id'sId 列表的存储 Proc 数据类型
【发布时间】:2014-11-05 15:57:50
【问题描述】:

如果我想传递一个 ID 列表/字符串,我应该在下面的 StoredProc 中定义我的数据类型,例如。 (1, 2, 5, 12, 99)?

create PROCEDURE [dbo].[TABLE_Delete]
    -- Add the parameters for the stored procedure here
    @TId datatype = null
AS
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    delete from dbo.TABLE T where T.Id in (@TId)

END

我的 TId 字段是 Int 类型的

【问题讨论】:

  • 你是从什么叫 sp 的?
  • 对于 Java 应用程序

标签: stored-procedures sql-server-2012


【解决方案1】:

您需要将数据作为nvarchar(xx) 传递,例如“1,2,3,4” 然后使用 split 函数将它们拆分并将查询编写为

 delete from dbo.TABLE T where T.Id in (dbo.split(@param,','))

这是Split函数的代码

CREATE FUNCTION Split
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
-- Id column can be commented out, not required for sql splitting string
  id int identity(1,1), -- I use this column for numbering splitted parts
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select
    r.value('.','varchar(max)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
GO

【讨论】:

  • 很抱歉,我没有遵循您在此处所写的内容。 :(
【解决方案2】:

另一种分割方式

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2019-12-06
    • 2010-10-08
    • 2017-04-03
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多