T-SQL存储过程-只选择几列

T-SQL存储过程-只选择几列,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个从表中选择所有列的存储过程。但我只需要选择其中的几个 如何分配变量以从表中选择几列 现有存储过程代码: DECLARE @DatabaseName NVARCHAR(255) = N’AdventureWorksDW’ DECLARE @SchemaName NVARCHAR(255) = N’dbo’ DECLARE @TableName NVARCHAR(255) = N’DimProduct’ BEGIN SET NOCOUNT ON -- Declare the parame

我有一个从表中选择所有列的存储过程。但我只需要选择其中的几个

如何分配变量以从表中选择几列

现有存储过程代码:

DECLARE @DatabaseName NVARCHAR(255) = N’AdventureWorksDW’
DECLARE @SchemaName NVARCHAR(255) = N’dbo’
DECLARE @TableName NVARCHAR(255) = N’DimProduct’

BEGIN
SET NOCOUNT ON

-- Declare the parameters internal to query
DECLARE @SQLString NVARCHAR(MAX) = N”
DECLARE @ParamDefinition NVARCHAR(MAX) = N”
DECLARE @ColumnList TABLE (
ColumnId INT IDENTITY(1,1)
, ColumnName NVARCHAR(255)
, ColumnMaxLength INT
, ColumnMinLength INT
)

DECLARE @ColumnMaxLength INT
DECLARE @ColumnMinLength INT
DECLARE @ColumnCount INT = 0
DECLARE @LoopCounter INT = 1
DECLARE @ColumnName NVARCHAR(255)

SET @SQLString =
N’SELECT COLUMN_NAME FROM ‘
@DatabaseName + N’.’ + N’INFORMATION_SCHEMA.COLUMNS
WHERE
DATA_TYPE IN (”CHAR”, ”NCHAR”, ”VARCHAR”, ”NVARCHAR”)
AND TABLE_SCHEMA = @SchemaName
AND TABLE_NAME = @TableName’

SET @ParamDefinition = N’@SchemaName NVARCHAR(255), @TableName NVARCHAR(255)’

INSERT INTO @ColumnList (ColumnName)

EXECUTE sp_executesql @SQLString, @ParamDefinition, @SchemaName, @TableName
SELECT @ColumnCount = COUNT(*) FROM @ColumnList

WHILE (@LoopCounter <= @ColumnCount)

BEGIN

SELECT @ColumnName = ColumnName
FROM @ColumnList
WHERE ColumnId = @LoopCounter

SET @SQLString =
N’SELECT ‘
‘@ColumnMinLength = MIN(LEN(‘ + @ColumnName + ‘))’
‘, @ColumnMaxLength = MAX(LEN(‘ + @ColumnName + ‘))’
‘ FROM ‘
@DatabaseName + N’.’ + @SchemaName + N’.’ + @TableName
‘ WITH (NOLOCK) ‘

SET @ParamDefinition = N’@ColumnMinLength INT OUTPUT, @ColumnMaxLength INT OUTPUT’

EXECUTE sp_executesql @SQLString, @ParamDefinition, @ColumnMinLength OUTPUT, @ColumnMaxLength OUTPUT

UPDATE @ColumnList

SET
ColumnMinLength = @ColumnMinLength
, ColumnMaxLength = @ColumnMaxLength
WHERE ColumnId = @LoopCounter

SET @LoopCounter += 1

END

SELECT
ColumnName AS [Column Name]
, ColumnMinLength AS [Column Minimum Length]
, ColumnMaxLength AS [Column Maximum Length]
FROM @ColumnList
ORDER BY [Column Name]

END

是否可以直接从表中进行选择,而不使用存储过程

如果是这样,您可以使用语法

SELECT Column1, Column2, ColumnN
FROM MyTable
您可以按如下方式创建和执行它

create procedure SELECT_MyTable (
    @fieldList nvarchar(max)
)
as
declare @select nvarchar(max)

set @select = 'SELECT ' + @fieldList + ' FROM MyTable'

exec sp_executesql @select

GO

declare @fieldList nvarchar(max) = 'UserName,region'
exec SELECT_MyTable @fieldList

变量不选择列。如果需要更改过程中的列,则需要修改过程。您尝试了什么?也许如果您演示了一点过程,这将更容易回答。下面是我正在编写的脚本。请准备好在3。。。2.1.是的,我意识到不能对列名使用参数。只要确保@fieldList是在内部生成的,而不是从任何用户输入生成的,就可以了。