1

ストアド プロシージャを変更したいので、identity列名を指定しません。

INSERT INTO tablName ..... WHERE IDENTITY_Column = 10

SQL Server Management Studio に列を参照するように指示して、IDENTITY(少なくとも私のテーブルではデフォルトである) autoincremet PK ID 型である型によって列を見つけることができますか?

4

3 に答える 3

3

あなたがやろうとしていることを確認するのに十分なコードを実際に提供していませんが、質問のスニペットからです。

WHERE IDENTITY_Column = 10

あなたはただ使うことができます

WHERE $IDENTITY = 10

そのために(名前を指定せずにID列に対してフィルタリングするため)。

実際に列名を検索する必要がある場合は、非推奨のビューを回避する簡単な方法があります

SELECT name
FROM sys.identity_columns
WHERE object_id = object_id('dbo.YourTable')
于 2012-09-29T19:50:48.353 に答える
1

今までにこの情報を見つけました。

それがプレーンでシンプルなバージョンです。

declare @tblName sysname = '______'--<== enter a table name

declare @NameOfIDColumn sysname =
(
SELECT Name 
FROM syscolumns
WHERE COLUMNPROPERTY( id ,name, 'IsIdentity') = 1 and OBJECT_NAME(id)= @tblName )

select  @NameOfIDColumn   AS 'result'

これをオプションとして追加して、そのレコードでソートされたテーブルの最後の行を表示することができます#

declare  @query VARCHAR(100) =  'Select Top 1 * FROM '+ @tblName +' Order BY ' + @IdentColumnName + ' desc' ;
EXEC (@query);

遊んだり、.net プロジェクトのテスト ページとして作成したりするには、これを、テスト ページにメッセージを出力するストアド プロシージャとして作成します。

declare @tblName sysname = '______'--<== enter a table name

declare @IdentColumnName sysname =
(
SELECT Name 
FROM syscolumns
WHERE COLUMNPROPERTY( id ,name, 'IsIdentity') = 1 and OBJECT_NAME(id)= @tblName )
declare @result VARCHAR (50) = @tblName + ' Identity Column is ' + @IdentColumnName;
select  @result   AS 'result'

Martin Smithによる「idntity column search」の短縮版を使用

declare @tblName sysname = '______'--<== enter a table name

declare @IdentColumnName sysname =
(SELECT name FROM sys.identity_columns WHERE object_id = object_id(@TableName))
declare @result VARCHAR (50) = @tblName + ' Identity Column is ' + @IdentColumnName;
select  @result   AS 'result'
于 2012-09-29T04:07:35.340 に答える
0

これは、ストアド プロシージャを介してプルしようとしていたテーブル コピー トリックに関連しています。

USE [YourDataBaseName]
GO
/****** Object:  StoredProcedure [dbo].[Utils_TableRowCopy]    Script Date: 10/03/2012 18:26:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Utils_TableRowCopy](
    @TableName VARCHAR(50) ,
    @RowNumberToCopy INT
)



AS
BEGIN


declare @RowIdentity sysname =
(
 SELECT name FROM sys.identity_columns WHERE object_id = object_id(@TableName)
)

    DECLARE @columns VARCHAR(5000), @query VARCHAR(8000);
    SET @query = '' ;

    SELECT @columns =
        CASE
            WHEN @columns IS NULL THEN column_name
            ELSE @columns + ',' + column_name
        END
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE (
        TABLE_NAME = LTRIM(RTRIM(@TableName))
        AND
        column_name <> LTRIM(RTRIM(@RowIdentity))
    );

    SET @query = 'INSERT INTO ' + @TableName + ' (' + @columns + ') SELECT ' + @columns + ' FROM ' + @TableName + ' WHERE ' + @RowIdentity + ' = ' + CAST(@RowNumberToCopy AS VARCHAR);

    --SELECT SCOPE_IDENTITY();
    declare  @query2 VARCHAR(100) =  ' Select Top 1 * FROM '+ @TableName +' Order BY ' + @RowIdentity + ' desc' ;
    EXEC (@query);
    EXEC (@query2);
END
于 2012-10-03T16:47:18.777 に答える