ストアド プロシージャを変更したいので、identity
列名を指定しません。
INSERT INTO tablName ..... WHERE IDENTITY_Column = 10
SQL Server Management Studio に列を参照するように指示して、IDENTITY
(少なくとも私のテーブルではデフォルトである) autoincremet PK ID 型である型によって列を見つけることができますか?
ストアド プロシージャを変更したいので、identity
列名を指定しません。
INSERT INTO tablName ..... WHERE IDENTITY_Column = 10
SQL Server Management Studio に列を参照するように指示して、IDENTITY
(少なくとも私のテーブルではデフォルトである) autoincremet PK ID 型である型によって列を見つけることができますか?
あなたがやろうとしていることを確認するのに十分なコードを実際に提供していませんが、質問のスニペットからです。
WHERE IDENTITY_Column = 10
あなたはただ使うことができます
WHERE $IDENTITY = 10
そのために(名前を指定せずにID列に対してフィルタリングするため)。
実際に列名を検索する必要がある場合は、非推奨のビューを回避する簡単な方法があります
SELECT name
FROM sys.identity_columns
WHERE object_id = object_id('dbo.YourTable')
今までにこの情報を見つけました。
それがプレーンでシンプルなバージョンです。
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'
これは、ストアド プロシージャを介してプルしようとしていたテーブル コピー トリックに関連しています。
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