2

我在作业中遇到了一个问题。我的讲师不是最擅长用我能理解的方式解释事情,所以我希望我能在这里得到一些帮助。

这是给我们的问题:

构造一个存储过程,将数据插入到关键字表中。输入字符串的格式应为 (Topic_name, 'K1,W1,K2,W2,K3,W3...Kn, Wn')。Ks 是关键字,Ws 是权重。如果主题表中找不到主题名称,则需要先将新主题名称插入主题表,然后将其他数据插入关键字表。您的存储过程应始终检查字符串模式以确保其格式正确并且使用了正确的数据类型。如果字符串模式无效,请向用户提供反馈消息。

这是我的关键字表:

CREATE TABLE Keyword(
    Topic_Name  VARCHAR(30) NOT NULL,
    Keyword VARCHAR(30) NOT NULL,
    K_weight    INT     NOT NULL,
    PRIMARY KEY(Topic_Name, Keyword),
    FOREIGN KEY(Topic_Name) REFERENCES Topic);

我遇到的主要问题是参数。我不知道如何让 SP 计算用户包含了多少参数。我能得到的任何帮助将不胜感激。如果您需要任何其他信息,请告诉我。干杯。

4

3 回答 3

0

您可以使用如下临时表。

需要“数组”的过程:

create table #array
(
  value1 varchar(30),
  value2 varchar(30)
)
go

create procedure myproc
as
begin

  select * from #array

end
go

drop table #array

go

过程填充并将数组发送到 myproc:

create procedure myproc2
as
begin

  create table #array
  (
    value1 varchar(30),
    value2 varchar(30)
   )
  --fill an array             
  insert into  #array values ('A','B')      
  insert into  #array values ('C','D')

  exec myproc

  drop table #array
end

go

你可以运行它:

exec myproc2
于 2012-10-10T07:33:08.160 回答
0

这会让你开始。它将逗号分隔的值列表解析为临时表:

DECLARE @KeywordList varchar(max) //This can be a SP param

CREATE TABLE #Keywords(varchar(10) keyword NOT NULL); 

DECLARE @Keyword varchar(10), @Pos int

SET @KeywordList= LTRIM(RTRIM(@KeywordList))+ ','
SET @Pos = CHARINDEX(',', @KeywordList, 1)

--Parse varchar and split IDs by comma into temp table
IF REPLACE(@KeywordList, ',', '') <> ''
BEGIN
    WHILE @Pos > 0
    BEGIN
        SET @Keyword= LTRIM(RTRIM(LEFT(@KeywordList, @Pos - 1)))
        IF @Keyword <> ''
        BEGIN
            INSERT INTO #Keywords(ID) VALUES (@Keyword) 
        END
        SET @KeywordList = RIGHT(@KeywordList, LEN(@KeywordList) - @Pos)
        SET @Pos = CHARINDEX(',', @KeywordList, 1)

    END
END 

--Return a count of all rows
SELECT @TotalRows = COUNT(Keyword) FROM #Keywords; 

    --Now process data from #Keywords as required
于 2012-10-10T07:33:32.057 回答
0

据我了解,您的程序将只有一个字符串参数。然后,您在存储过程中解析此字符串(查找逗号)并处理每个参数直到字符串结尾。

于 2012-10-10T07:02:03.627 回答