1

我想改变一个存储过程,所以我不会提供identity列名

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

我可以告诉 sql server managment studio 仅引用该IDENTITY列,以便它会通过其类型(至少在我的表中是默认值)自动增量 PK ID 类型来找到它

4

3 回答 3

3

您没有真正提供足够的代码让我们看到您正在尝试做的事情,而是从问题中的代码段中看到。

WHERE IDENTITY_Column = 10

你可以使用

WHERE $IDENTITY = 10

为此(在不指定名称的情况下过滤标识列)。

如果您确实需要查找列名,那么一种更简单的方法是避免弃用视图

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的“身份列搜索”的更短版本

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 回答