Sql server 将While与SELECT statement一起使用

Sql server 将While与SELECT statement一起使用,sql-server,Sql Server,我的目标是创建多个包含空单元格的列 基本上,这只需要定义一定数量的列: SELECT NOM_EMP,PRENOM_EMP, '' as [1], '' as [2] FROM EMPLOYE 我试过这个,但不起作用: DECLARE @I AS INT SET @I = 10 SELECT ROW_NUMBER() OVER (ORDER BY NOM_EMP) as 'Number', NOM_EMP, Prenom_EMP, WHILE @I < 10

我的目标是创建多个包含空单元格的列

基本上,这只需要定义一定数量的列:

SELECT NOM_EMP,PRENOM_EMP, '' as [1], '' as [2] 
FROM EMPLOYE
我试过这个,但不起作用:

DECLARE @I AS INT

SET @I = 10

SELECT 
    ROW_NUMBER() OVER (ORDER BY NOM_EMP)  as 'Number', NOM_EMP, Prenom_EMP, 
    WHILE @I < 10
    BEGIN
         SELECT '' AS
    END 
FROM EMPLOYE
这有可能实现吗

预期结果:假设我在循环中使用了8


一种方法是使用动态SQL,使用XML路径构建列列表:


在SQL Server 2017及更高版本中,您可以使用替换。

SQL Server在设计上是声明性的,不支持宏替换

这就留下了动态SQL

范例

生成的SQL


你的伪代码不清楚。将预期结果添加到您的问题中。@DanGuzman doneIt成功了,我很感激。我可以将其放入存储过程或函数中调用吗?@Zkai很乐意提供帮助。仅在存储过程中。函数不接受动态SQL抱歉,我没有看到您的答案。你比我快了一分钟。
DECLARE
      @SQL nvarchar(MAX)
    , @i int = 10;

WITH 
     t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
    ,t1000 AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS i FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
SELECT @SQL = 'SELECT NOM_EMP,PRENOM_EMP,' + 
    STUFF((SELECT ','''' AS ' + QUOTENAME(CAST(i AS nvarchar(4)))
    FROM t1000
    WHERE i < @i
    FOR XML PATH(''), TYPE).value('.','nvarchar(MAX)'),1,1,'')
    + N' from EMPLOYE';
EXECUTE sp_executesql @SQL;
Declare @Int int = 8

Declare @SQL varchar(max) = '
Select NOM_EMP,PRENOM_EMP,'
+ (Select Stuff((Select ',[' +cast(N as varchar(25))+']=''''' 
                From (Select Top (@Int) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1) A
                For XML Path ('')),1,1,'')
   )
+ ' From Employee'

Exec(@SQL)
Select NOM_EMP,PRENOM_EMP,[1]='',[2]='',[3]='',[4]='',[5]='',[6]='',[7]='',[8]='' 
 From Employee