如何在不使用声明变量的情况下编写单选 [英] How do i write single select without using declared variables

查看:74
本文介绍了如何在不使用声明变量的情况下编写单选的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在不使用声明变量的情况下编写单选。我们无法使用更多变量可能会导致性能降低。使用Stuff Function。我想要相同的查询但是使用Stuff Function我将如何做.no声明变量。



  SET   NOCOUNT   ON ; 
DECLARE @ CountryPL varchar 200
DECLARE @ StreetNumber varchar 200
DECLARE @ StreetName varchar 200
DECLARE @ City varchar 200
SET @ CountryPL = NULL
SET @ StreetNumber = NULL
SET @ StreetName = NULL
SELECT @ CountryPL = COALESCE @ CountryPL + ' ,'' ')+ CountryPL, @ StreetNumber = COALESCE @ StreetNumber + ' ,'' ')+ StreetNumber,
@ StreetName = COALESCE @ StreetName + ' ,'' ')+ StreetName, @ City = COALESCE @ City + ' ,'' ')+ City
FROM 学生S

内部 加入人P On S.PersonID = P.PersonID
内部 JOIN PersonAddress PA ON P.PersonID = PA.PersonID
INNER JOIN 地址A ON A.AddressID = PA.AddressID
其中​​ S.StudentID = @ StudentID

SELECT
@ CountryPL @ StreetNumber @ StreetName @ City
END





我的尝试:



我试过这个(使用STUFF功能):

  SET   NOCOUNT   ON ; 
DECLARE @ PersonID INT
SELECT @ PersonID = PersonID 来自 dbo.Student WHERE StudentID = @ studentid
StudentID
< span class =code-keyword> SELECT
@ studentid AS StudentID ,
STUFF(( SELECT ' ,' + A. [StreetNumber]
FROM dbo.PersonAddress PA
INNER JOIN dbo。[地址] A
ON PA.AddressID = A.AddressID
WHERE PA.PersonID = p.PersonID
FOR xml PATH(' '), TYPE
.value(' 。'' NVARCHAR(MAX)'), 1 1 ' '),
STUFF(( SELECT
' ,' +
A. [StreetName]
FROM dbo.PersonAddress PA
INNER JOIN dbo。[Address] A
ON PA.AddressID = A.AddressID
WHERE PA.PersonID = P.PersonID
FOR xml PATH(' '),< span class =code-keyword> TYPE )
.value(' 。'' NVARCHAR(MAX)'), 1 1 ' '),
STUFF(( SELECT
' ,' +
A. [城市]
FROM dbo.PersonAddress PA
INNER JOIN dbo。[地址] A
ON PA.AddressID = A.AddressID
WHERE PA.PersonID = P.PersonID
FOR xml PATH (' '), TYPE
.value(' 。'' NVARCHAR(MAX)'), 1 1 ' '
FROM dbo.Person S
WHERE P.PersonID = @ PersonID

END

解决方案

如果您想使用STUFF()函数来连接行,请阅读这些文章:

TSQL - 使用FOR XML PATH()连接行Sql And Me [ ^ ]

字符串连接的STUFF和FOR XML PATH - SQL Server存储库 [ ^ ]

在Transact-SQL中连接行值 [ ^ ]


  GO  

SET ANSI_NULLS ON
< span class =code-keyword> GO
SET QUOTED_IDENTIFIER ON
GO


create PROCEDURE [dbo]。[RajeshStudentAddressesByStudentID] @ studentid int
AS
BEGIN


- EXEC dbo.uspSelectStudentAddressesByStudentID 1

SET NOCOUNT ON ;
DECLARE @ PersonID INT
SELECT @ PersonID = PersonID 来自 dbo.Student WHERE StudentID = @ studentid
StudentID
< span class =code-keyword> SELECT
@ studentid AS StudentID ,

STUFF(( SELECT
' ,' +
CAST(A. [AddressID] AS VARCHAR
FROM dbo.PersonAddress SA
INNER JOIN dbo。[地址] A
ON SA.AddressID = A.AddressID
WHERE SA.PersonID = S.PersonID
FOR xml PATH(' '), TYPE
.value(' 。' ' NVARCHAR(MAX)'), 1 1 ' '),

STUFF(( SELECT
' ,' +
A. [StreetNumber]

FROM dbo .PersonAddress SA
INNER JOIN dbo。[地址] A
ON SA.AddressID = A.AddressID
WHERE SA.PersonID = S.PersonID
FOR xml PATH(' '), TYPE
.value(' 。'' NVARCHAR(MAX)'), 1 1 ' '),
STUFF(( SELECT
' ,' +
A. [StreetName]
FROM dbo.PersonAddress SA
INNER JOIN dbo。[地址] A
ON SA .AddressID = A.AddressID
WHERE SA.PersonID = S.PersonID
FOR xml PATH(' '), TYPE
.value(' 。'' NVARCHAR(MAX)'), 1 1 ' '),
STUFF(( SELECT
' ,' +
A. [城市]
FROM dbo.PersonAddress SA
INNER JOIN dbo。[地址] A
ON SA.AddressID = A.AddressID
< span class = code-keyword> WHERE SA.PersonID = S.PersonID
FOR xml PATH(' '), TYPE
.value(' 。'' NVARCHAR(MAX)'), 1 1 ' '
FROM dbo.Person S
WHERE S.PersonID = @ PersonID

END


How do i write Single Select without using declared variables.We cant use more variables may cause reducing performance.Using Stuff Function . I Want same query but using Stuff Function how i will do .no Declare Variable .

 SET NOCOUNT ON;
DECLARE @CountryPL varchar(200)
DECLARE @StreetNumber varchar(200)
DECLARE @StreetName varchar(200)
DECLARE @City varchar(200)
SET @CountryPL = NULL
SET @StreetNumber = NULL
SET @StreetName = NULL
  SELECT @CountryPL =  COALESCE(@CountryPL + ',','')+ CountryPL ,@StreetNumber =  COALESCE(@StreetNumber + ',','')+ StreetNumber ,
 @StreetName =  COALESCE(@StreetName + ',','')+ StreetName,@City =  COALESCE(@City + ',','')+ City
FROM Student S

  Inner Join Person P On S.PersonID=P.PersonID
   Inner JOIN PersonAddress PA ON P.PersonID = PA.PersonID 
 INNER JOIN  Address A ON A.AddressID = PA.AddressID
   Where   S.StudentID =  @StudentID 

	SELECT @CountryPL,@StreetNumber,@StreetName,@City
   END



What I have tried:

I tried this one (using STUFF function):

 SET NOCOUNT ON;
 DECLARE @PersonID INT
SELECT @PersonID=PersonID from dbo.Student WHERE StudentID=@studentid
 Group By StudentID
SELECT
   @studentid AS StudentID,
       STUFF((SELECT ',' + A.[StreetNumber]
          FROM dbo.PersonAddress PA
   INNER JOIN dbo.[Address] A
     ON PA.AddressID = A.AddressID
   WHERE PA.PersonID = p.PersonID
   FOR xml PATH (''), TYPE)
   .value('.', 'NVARCHAR(MAX)'), 1, 1, '') ,
   STUFF((SELECT
     ',' +
       A.[StreetName]
    FROM dbo.PersonAddress PA
   INNER JOIN dbo.[Address] A
     ON PA.AddressID = A.AddressID
   WHERE PA.PersonID = P.PersonID
   FOR xml PATH (''), TYPE)
   .value('.', 'NVARCHAR(MAX)'), 1, 1, '') ,
   STUFF((SELECT
     ',' +
     A.[City]
    FROM dbo.PersonAddress PA
   INNER JOIN dbo.[Address] A
     ON PA.AddressID = A.AddressID
   WHERE PA.PersonID = P.PersonID
   FOR xml PATH (''), TYPE)
   .value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    FROM dbo.Person S
 WHERE P.PersonID = @PersonID

 END

解决方案

If you would like to use STUFF() function to concatenate rows, please read these articles:
TSQL - Concatenate Rows using FOR XML PATH() | Sql And Me[^]
STUFF AND FOR XML PATH for String Concatenation - SQL Server Repository[^]
Concatenating Row Values in Transact-SQL[^]


GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


create PROCEDURE   [dbo].[RajeshStudentAddressesByStudentID]   @studentid int
AS
BEGIN


--EXEC dbo.uspSelectStudentAddressesByStudentID 1

  SET NOCOUNT ON;
  DECLARE @PersonID INT
 SELECT @PersonID=PersonID from dbo.Student WHERE StudentID=@studentid
  Group By StudentID
 SELECT
    @studentid AS StudentID,

	 STUFF((SELECT 
      ',' + 
	  CAST(A.[AddressID] AS VARCHAR)
	  FROM dbo.PersonAddress SA
    INNER JOIN dbo.[Address] A
      ON SA.AddressID = A.AddressID
    WHERE SA.PersonID = S.PersonID 
    FOR xml PATH (''), TYPE)
    .value('.', 'NVARCHAR(MAX)'), 1, 1, '') ,

	STUFF((SELECT 
      ',' + 
        A.[StreetNumber]

    FROM dbo.PersonAddress SA
    INNER JOIN dbo.[Address] A
      ON SA.AddressID = A.AddressID
    WHERE SA.PersonID = S.PersonID 
    FOR xml PATH (''), TYPE)
    .value('.', 'NVARCHAR(MAX)'), 1, 1, '') ,
	STUFF((SELECT 
      ',' + 
        A.[StreetName]
     FROM dbo.PersonAddress SA
    INNER JOIN dbo.[Address] A
      ON SA.AddressID = A.AddressID
    WHERE SA.PersonID = S.PersonID 
    FOR xml PATH (''), TYPE)
    .value('.', 'NVARCHAR(MAX)'), 1, 1, '') ,
	STUFF((SELECT
      ',' + 
      A.[City]
     FROM dbo.PersonAddress SA
    INNER JOIN dbo.[Address] A
      ON SA.AddressID = A.AddressID
    WHERE SA.PersonID = S.PersonID 
    FOR xml PATH (''), TYPE)
    .value('.', 'NVARCHAR(MAX)'), 1, 1, '')
	 FROM dbo.Person S
  WHERE S.PersonID = @PersonID

  END


这篇关于如何在不使用声明变量的情况下编写单选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆