-2

重複の可能性:
関数を使用した SQL クエリでエラーが発生する

関数を作成しようとすると、次のエラーが発生します。

'CREATE FUNCTION' は、クエリ バッチの最初のステートメントである必要があります。

エラー:

キーワード「with」付近の構文が正しくありません。

このステートメントが共通テーブル式、xmlnamespaces 句、または変更追跡コンテキスト句である場合、前のステートメントはセミコロンで終了する必要があります。スカラー変数「@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
)
;
4

4 に答える 4

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
)
;
于 2012-09-28T06:25:00.767 に答える
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クエリでGoステートメントを実行できるようになりました...

于 2012-09-28T07:54:39.040 に答える
0

USE AppName と create ステートメントの間に 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 
) 
;
于 2012-09-28T06:22:50.837 に答える
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
于 2012-09-28T07:21:13.320 に答える