从 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;
我在 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;