根据微软MSDN上的这个链接:
http://msdn.microsoft.com/en-us/library/aa933206(v=sql.80)
这是insert语句的语法。
Syntax
INSERT [ INTO]
{ table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
| rowset_function_limited
}
{ [ ( column_list ) ]
{ VALUES
( { DEFAULT | NULL | expression } [ ,...n] )
| derived_table
| execute_statement
}
}
| DEFAULT VALUES
< table_hint_limited > ::=
{ FASTFIRSTROW
| HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}
此外,在文档中,它定义了&#34; * execute_statement *&#34;在VALUES子句中如下:
execute_statement
是否有任何有效的EXECUTE语句返回带有SELECT或的数据 READTEXT 语句。
我在存储过程中尝试了以下格式:
INSERT INTO #MANAGERS (MANAGERCHARS)
READTEXT #MANAGERS.MANAGERIDS @ptrval @CharIndex 1
并收到以下错误:
Msg 156, Level 15, State 1, Procedure usp_TestQualityMonitor, Line 117
Incorrect syntax near the keyword 'READTEXT'.
根据我在这个问题中提到的文档,READTEXT应该是一个有效的方法作为execute_statement,所以我做错了什么?为什么我收到此消息?以及如何在没有错误的情况下正确格式化此语句?
注意:通过删除&#34; VALUES&#34;修复SQL。仍然得到同样的错误。
答案 0 :(得分:1)
如果仔细阅读语法图,可以使用
(a)价值观(等)
OR
(b)派生表
OR
(c)execute_statement
你不能说:
INSERT dbo.table VALUES(EXEC dbo.procedure);
但是可以说:
INSERT dbo.table EXEC dbo.procedure;
(当然取决于dbo.procedure的作用。)
所以也许你可以试试:
INSERT INTO #MANAGERS (MANAGERCHARS) --VALUES
READTEXT #MANAGERS.MANAGERIDS @ptrval @CharIndex 1;
但是,我不是100%READTEXT
在此上下文中是有效的执行语句。
在更新你真正要做的事情之后,分割功能怎么样?
首先,创建一个数字表:
SELECT n = IDENTITY(INT, 1, 1) INTO dbo.Numbers
FROM syscolumns CROSS JOIN syscolumns AS c2;
CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(n);
在我的SQL Server 2000系统上,这会创建66,000多行,因此它将支持超过64K的字符串。如果您的字符串长于此值,则可能需要添加额外的交叉连接。
现在,创建一个将处理NTEXT的拆分函数(大多数你会发现这些天不会打扰,因为NTEXT已被弃用,并且大多数人已经能够完全丢弃SQL Server 2000)。我不记得我最初在哪里采购这个,但我已经使用它好几年了:
ALTER FUNCTION dbo.Split_NTEXT
(
@list NTEXT,
@delimiter CHAR(1)
)
RETURNS @table TABLE
(
string NVARCHAR(4000)
)
AS
BEGIN
DECLARE @chunks TABLE (chunk NVARCHAR(4000) NOT NULL);
DECLARE @chunk NVARCHAR(4000), @p INT, @ml INT, @e INT;
SELECT @p = 1, @ml = 3998;
WHILE (DATALENGTH(@list)/2) - (@p-1) >= @ml
BEGIN
SET @chunk = SUBSTRING(@list, @p, @ml);
SET @e = @ml - CHARINDEX(@delimiter, REVERSE(@chunk));
INSERT @chunks(chunk) SELECT @delimiter + SUBSTRING(@chunk, 1, @e) + @delimiter;
SET @p = @p - 1 + @e + 2;
END
INSERT @chunks(chunk) SELECT @delimiter + SUBSTRING(@list, @p, @ml) + @delimiter;
INSERT @table(string) SELECT s = LTRIM(RTRIM(SUBSTRING(s.chunk, n.n + 1,
CHARINDEX(@delimiter, s.chunk, n.n + 1) - n.n - 1)))
FROM dbo.Numbers AS n INNER JOIN @chunks AS s
ON n.n <= LEN(s.chunk) - 1
AND SUBSTRING(s.chunk, n.n, 1) = @delimiter;
RETURN;
END
GO
用法:
SELECT string
FROM dbo.Split_NTEXT(N'foo,bar,blat,mort,splunge', ',');
结果:
string
--------
foo
bar
blat
mort
splunge
与CLR或TVP等更现代的方法相比,这不会特别快,但与处理READTEXT或其他神秘方法相比,你可能认为自己陷入困境的麻烦相对较少在2000年。