从 sql table 检索参数以在过程中使用

Retrieving parameter from sql table to use in procedure

我在 SQL 服务器中有这个程序来检查 table 中是否存在单词,如果存在则更新 table,如果不存在则将单词添加到 table。

CREATE PROCEDURE raw_add @word nvarchar (100)
AS
BEGIN
    IF EXISTS(SELECT * FROM Connection.dbo.Dict WHERE game + '%' LIKE @word + '%')
        BEGIN
            UPDATE Dict SET count=count+1 WHERE game + '%' LIKE @word + '%'
        END
    ELSE
        BEGIN
            INSERT INTO Dict (mongol) VALUES (@word)
        END
END

我可以执行程序。

EXECUTE raw_add 'dota'

但是我不想输入每个单词,而是想将另一个 table 中的单词作为过程的参数。我有这段代码,但是没有提供任何参数错误。

EXECUTE raw_add SELECT words_to_add
FROM Connection.dbo.raw p
CROSS APPLY string_split(p.words_to_add, ' ')

你做不到 exec <procedure> select <parameters>,即使你编码,也没有什么意义,因为它会是 RBAR - meaning you will run your procedure Row By Agonizing Row (Acronym source: Jeff Moden)。

您需要做的是编写一个新过程,它将使用基于集合的方法进行更新插入。

SQL 服务器有一个 Merge 命令用于更新插入,您可以使用它。

DECLARE @words AS TABLE (word nvarchar(100))

INSERT INTO @words (word)
-- assuming that's the name of the column from the string split
SELECT /*perhaps DISTINCT here?*/ Item 
FROM Connection.dbo.raw p
CROSS APPLY string_split(p.words_to_add, ' ')

MERGE Connection.dbo.Dict  AS target  
USING (SELECT word FROM @words) AS source (word) 
    ON (target.game LIKE '%' + source.word + '%')  
WHEN MATCHED THEN   
    UPDATE SET count += 1
WHEN NOT MATCHED THEN  
    INSERT (mongol)  
    VALUES (source.word)

请使用以下方式获取您的需求。

DECLARE @word varchar(50);
    Declare AIX Cursor for 
    SELECT words_to_add FROM dbo.raw p
    --SELECT  column FROM  database.dbo.table1;
    Open AIX;
    Fetch Next from AIX into  @word;
    -- this will produce for example, 100 results
    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF (@word IS Not NULL) 
        exec raw_add @word
    FETCH NEXT FROM AIX 
        INTO @word;
    END
    CLOSE AIX;
    DEALLOCATE AIX;