2012-09-28 90 views
-2

Possible Duplicate:
Getting error in SQL query with function use出錯創建SQL Server中的功能2008

我得到試圖創建一種功能,當這個錯誤:

'CREATE FUNCTION' must be the first statement in a query batch.

Error:

Incorrect syntax near the keyword 'with'.

If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon. Must declare the scalar variable "@sep".

這是我的T-SQL代碼:

CREATE FUNCTION [dbo].[fn_Split] (@sep nvarchar(10), @s nvarchar(4000)) 
RETURNS table 
AS 
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s) 
UNION ALL 
SELECT pn + 1, stop + (datalength(@sep)/2), CHARINDEX(@sep, @s, stop + (datalength(@sep)/2)) 
FROM Pieces 
WHERE stop > 0 
) 
SELECT pn, 
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS value 
FROM Pieces 
) 
; 
+0

這和你的[上一個問題]有什麼不同?( http://stackoverflow.com/questions/12623142/getting-error-in-sql-query-with-function-use)? –

+3

這不僅僅是「與之前相關」 - 這完全是同一個問題。而且你甚至不打算包含從你那裏精心收集到的任何有用信息(即,這不是從管理工作室運行的腳本,而是從C#應用程序運行此代碼) –

+0

由於方便搜索者,是否可以在標記爲重複的消息框中包含前一個問題的鏈接?達米恩非常友善,在他的評論中包含了這個鏈接,但這不是一貫的做法。 – EoRaptor013

回答

0

在USE AppName和創建語句之間添加一個GO

類似於

Use AppName  
GO 

create FUNCTION [dbo].[fn_Split] (@sep nvarchar(10), @s nvarchar(4000)) 
RETURNS table 
AS 
RETURN ( 
WITH Pieces(pn, start, stop) AS ( 
SELECT 1, 1, CHARINDEX(@sep, @s) 
UNION ALL 
SELECT pn + 1, stop + (datalength(@sep)/2), CHARINDEX(@sep, @s, stop + (datalength(@sep)/2)) 
FROM Pieces 
WHERE stop > 0 
) 
SELECT pn, 
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS value 
FROM Pieces 
) 
; 
+1

問題是(正如你很快就會發現的,或者如果你看看他們以前的問題)他們沒有通過SSMS或SQL命令行工具運行它,所以'GO'不可用。他們之前被告知他們需要自行分批。我不確定爲什麼問這個新問題。 –

+0

,但使用GO不支持在C銳,所以我不能使用它。當我使用它給錯誤附近的語法不正確的語法... – Rahul

+0

@Damien_The_Unbeliever現在即時通訊在不同批次運行... – Rahul

1

你沒有返回類型定義的表結構

create FUNCTION [dbo].[fn_Split] (@sep nvarchar(10), @s nvarchar(4000)) 
RETURNS table TABLE (pn varcahr(100), values varchar(8000)) 
AS 
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s) 
UNION ALL 
SELECT pn + 1, stop + (datalength(@sep)/2), CHARINDEX(@sep, @s, stop + (datalength(@sep)/2)) 
FROM Pieces 
WHERE stop > 0 
)  SELECT pn, 
    SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS value 
FROM Pieces 
) 
; 
0
better than you will use procedure : 
CREATE procedure [dbo].[fn_Split] 
@sep nvarchar(10), 
@s nvarchar(4000)) 
AS 
begin 
    your logic.. 
    select col,.. from table; 
end 
+0

誰讚賞這個東西? TVF比分裂功能好得多,因爲它更通用。例如,您可以加入或添加where子句。 –

0

我得到了解決這個

using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 



SqlConnection conn = new SqlConnection(connectionString); 
conn.Open(); 
Server server = new Server(new ServerConnection(conn)); 
server.ConnectionContext.ExecuteNonQuery(query);     
conn.Close(); 

現在我可以在SQL查詢語句去運行。 ..