用于提取主键名称的动态SQL查询

时间:2014-12-12 17:02:34

标签: sql sql-server

我正在开发一个更大的查询,它将为我构建C#函数和类,但我遇到了一个小部分的问题,我需要重写下面的查询,以便特别是部分" @DataBaseName .INFORMATION_SCHEMA.KEY_COLUMN_USAGE"将工作。显然,目前的编写方式是行不通的,但对于我的生活,我无法弄清楚如何改变它以使其发挥作用。如果我只是输入带有实际数据库名称和数据库表名称的查询,它会起作用,但我需要能够在开始时将这两个存储在变量中以完成我正在寻找的任务。这适用于MS SQL Server 2008 R2

declare @TableName sysname = 'ENTERTABLENAME'
declare @DataBaseName sysname = 'ENTERDATABASENAME'

/* Start of Update Function Created */

declare @PrimaryKey varchar(max) = ''
 SELECT @PrimaryKey = COLUMN_NAME FROM @DataBaseName.INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND CONSTRAINT_NAME LIKE 'PK%'

1 个答案:

答案 0 :(得分:1)

您需要使用Dynamic SQL

DECLARE @TableName SYSNAME = 'Address'
DECLARE @DataBaseName SYSNAME = 'AdventureWorks2008'

DECLARE @PrimaryKey VARCHAR(max) = '',
        @sql        NVARCHAR(max)

SET @sql ='SELECT @PrimaryKey += '',''+COLUMN_NAME FROM '
          + @DataBaseName + '.INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = '''
          + @TableName
          + ''' AND CONSTRAINT_NAME LIKE ''PK%'''

--print @sql
EXEC Sp_executesql
  @sql,
  N'@PrimaryKey varchar(1000) output',
  @PrimaryKey output

SELECT RIGHT(@PrimaryKey, Len(@PrimaryKey) - 1)