我想改变一个存储过程,所以我不会提供identity
列名
INSERT INTO tablName ..... WHERE IDENTITY_Column = 10
我可以告诉 sql server managment studio 仅引用该IDENTITY
列,以便它会通过其类型(至少在我的表中是默认值)自动增量 PK ID 类型来找到它
我想改变一个存储过程,所以我不会提供identity
列名
INSERT INTO tablName ..... WHERE IDENTITY_Column = 10
我可以告诉 sql server managment studio 仅引用该IDENTITY
列,以便它会通过其类型(至少在我的表中是默认值)自动增量 PK ID 类型来找到它
您没有真正提供足够的代码让我们看到您正在尝试做的事情,而是从问题中的代码段中看到。
WHERE IDENTITY_Column = 10
你可以使用
WHERE $IDENTITY = 10
为此(在不指定名称的情况下过滤标识列)。
如果您确实需要查找列名,那么一种更简单的方法是避免弃用视图
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的“身份列搜索”的更短版本
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