QA@IT

SQLServer2014のストアドプロシージャの構文について

8931 PV

はじめまして。
SQLServer2014でパラメータ付きのストアドプロシージャを作っています。
パラメータ付きのストアドプロシージャを作ると、ほとんどのストアドで、
ストアド名の下部に赤い波線が出てしまい、「オブジェクト名~~が無効です」となってしまいます。
(パラメータの無いストアドでは、このような現象は起きません)
赤い波線が出ている状態でも、「クエリが正常に実行されました」とメッセージが出ます。
ManagementStudio上で実行すると、
実行はされるのですが、
実行したクエリの画面で、ストアド名の下にまた赤波線が出て、
「ストアドプロシージャ'****'が見つかりませんでした」となります。
それが原因ではないのかもしれませんが、プログラムから実行すると、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と、エラーになってしまいます。
SQLServer2005など以前のバージョンのSQLServerと比べて、ストアドの構文が変わってしまったとかがあるのでしょうか?

慣れていないので、質問の仕方が悪いようでしたら、ご容赦下さい。
よろしくお願いします。

(質問を編集しました。)

以下、ストアドの構文です。

****↓赤い波線の出るストアド↓****

USE [xdb]
GO
/****** Object:  StoredProcedure [dbo].[PR_TMユーザ抽出]    Script Date: 2015/10/12 18:54:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[PR_TMユーザ抽出]

    @intユーザID INT = NULL

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @QUERY NVARCHAR(MAX)

    SET @QUERY = 'SELECT * FROM VMユーザ WHERE intユーザID = ' + CONVERT(NVARCHAR,@intユーザID)

    BEGIN TRY
        EXEC (@QUERY)
    END TRY
    BEGIN CATCH
        DECLARE @EX NVARCHAR(MAX)
        SET @EX = 'クエリエラー:' + @QUERY
        RAISERROR(@EX , 16, 2)
        RETURN
    END CATCH

    RETURN
END

****↑ここまで↑****

****↓赤い波線の出ないストアド↓****

USE [xdb]
GO
/****** Object:  StoredProcedure [dbo].[PR_TM市区町村抽出]    Script Date: 2015/10/12 19:14:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[PR_TM市区町村抽出]

    @int都道府県コード INT = NULL

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @QUERY NVARCHAR(MAX)

    SET @QUERY = 'SELECT int都道府県コード,int市区町村コード,str市区町村名,int削除フラグ FROM M_市区町村 '
    SET @QUERY = @QUERY + 'WHERE int削除フラグ = 0 ' 
    IF @int都道府県コード IS NOT NULL
        SET @QUERY = @QUERY + 'AND int都道府県コード = ' + CONVERT(NVARCHAR,@int都道府県コード) 
    SET @QUERY = @QUERY +  ' ORDER BY int市区町村コード ASC '

    BEGIN TRY
        EXEC (@QUERY)
    END TRY
    BEGIN CATCH
        DECLARE @EX NVARCHAR(MAX)
        SET @EX = 'クエリエラー' + @QUERY
        RAISERROR(@EX,16,2)
        RETURN
    END CATCH 
RETURN
END

****↑ここまで↑****

  • flied_onion様、提案ありがとうございます。
    自分で書いた質問ながら、見にくいなと思ってました。
    -
  • ここはMarkdown形式になってます(詳しくは「使い方」を参照ください)ので、コードがMarkdownの書式にあってしまうと崩れてしまいます。
    簡単には コードブロックは 三連バッククォート(`)で括るといいです(またはスペース4つ以上でインデント)。 先頭 # 出始めると見出しになります(不意にデカい字になる場合はこれ)。
    -

回答

「作ると」と書いてありますが、ALTER PROCEDUREが示されてます。
CREATE PROCEDUREではないですか?

パラメータ無しなら上手くいくとあるので違うかもしれませんが。
既にあるプロシージャの変更で発生している場合は CREATE PROCEDURE文もあると検証しやすいと思います。

編集 履歴 (0)
  • flied_onion様ありがとうございます。
    作るという表現は適切ではなかったです。

    初めての質問なので、ここでのベストアンサーへのお礼でよいのかわかりませんが、自己解決しました。
    どうにもならないので、PCを閉じて、再度立ち上げたら、赤い波線は消えてました。
    なぜ波線が出たのかはわかりません。再起動以外、特に何もしていません。
    nullのエラーは、関係がなく、初歩的ミスでした。
    -
  • SSMSがオブジェクトの有無を再度解析したからでしょうかね。ちょっとわかりませんが、解決されたということでよかったです。

    自己解決の場合は、自分で回答してそれをベストアンサーにするといいですよ。
    (ここはベストアンサーの変更はできないような気がしますので、次回からはそのようにされるといいと思います)
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。