88

SQLサーバーで問題が発生しました。これは、作成した関数です。

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS @trackingItems1 TABLE (
   item       nvarchar  NULL,
   warehouse   nvarchar NULL,
   price int   NULL
) 
AS
BEGIN
   INSERT INTO @trackingItems1(item, warehouse, price)
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price; 

   RETURN;
END;

次のような関数を使用するクエリを作成すると、エラーが発生します

文字列型やバイナリは省略されます。ステートメントは終了されました

この問題を解決するにはどうすればよいですか?

select * from testing1(2)

これが私がテーブルを作成する方法です

CREATE TABLE stock(item       nvarchar(50) NULL,
                   warehouse   nvarchar(50) NULL,
                   price int NULL);
4

5 に答える 5

72

長さなしで etcを定義すると、デフォルトは 1 になります。varchar

n がデータ定義ステートメントまたは変数宣言ステートメントで指定されていない場合、デフォルトの長さは 1 です。CAST 関数で n が指定されていない場合、デフォルトの長さは 30 です。

したがって、 の@trackingItems1列に 400 バイトが予想される場合はstock、 を使用しますnvarchar(400)

それ以外の場合は、1 文字以上を収めようとしていますnvarchar(1)= 失敗

コメントとして、これも「複数ステートメント」であるため、テーブル値関数の不適切な使用です。このように書くことができ、より良く動作します

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS
AS
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price;

もちろん、通常の SELECT ステートメントを使用することもできます。

于 2013-02-22T08:06:21.123 に答える
43

ターゲット列の最大長が、挿入しようとしている値よりも短くなっています。

SQL マネージャーでテーブルを右クリックし、[デザイン] に移動して、テーブル構造と列の定義を視覚化します。

編集:

nvarchar 挿入の長さを、テーブルで定義されているものと同じかそれより短く設定してみてください。

于 2013-02-22T08:05:13.443 に答える
8

[dbo].[testing1] FUNCTION のようにアイテム倉庫のサイズを指定します。

@trackingItems1 TABLE (
item       nvarchar(25)  NULL, -- 25 OR equal size of your item column
warehouse   nvarchar(25) NULL, -- same as above
price int   NULL

) 

MSSQL では、 nvarcharのみが nvarchar(1) と等しいとしか言​​っていないため、ストックテーブルの列の値は切り捨てられます。

于 2013-02-22T08:09:47.987 に答える