Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xp\u sprintf-SQL Server中的整型占位符%d_Sql_Sql Server_Printf_String Formatting_Format Specifiers - Fatal编程技术网

xp\u sprintf-SQL Server中的整型占位符%d

xp\u sprintf-SQL Server中的整型占位符%d,sql,sql-server,printf,string-formatting,format-specifiers,Sql,Sql Server,Printf,String Formatting,Format Specifiers,我有一个XML模板,我需要使用xp\U sprintf基于表中的行值构建XML。此外,该表具有Int和Bit值 表架构:StudentMark: CREATE TABLE [dbo].[StudentMark] ( [StudentMarkId] [int] IDENTITY(1,1) NOT NULL, [StudentId] [uniqueidentifier] NOT NULL, [SubjectId] [uniqueidentifier] NOT NULL,

我有一个XML模板,我需要使用xp\U sprintf基于表中的行值构建XML。此外,该表具有Int和Bit值

表架构:StudentMark

CREATE TABLE [dbo].[StudentMark]
(
    [StudentMarkId] [int] IDENTITY(1,1) NOT NULL,
    [StudentId] [uniqueidentifier] NOT NULL,
    [SubjectId] [uniqueidentifier] NOT NULL,
    [Score] [int] NOT NULL,
    [ScoreInfo] [xml] NOT NULL,
    [GeneratedOn] [datetime2](2) NOT NULL,
    [IsPass] [bit] NOT NULL,
    CONSTRAINT [PK_StudentMark] 
       PRIMARY KEY CLUSTERED ([StudentMarkId] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
<ScoreInfo>
    <StudentMarkId>%d</StudentMarkId>
    <StudentId>%s</StudentId>
    <SubjectId>%s</SubjectId>
    <Score>%d</Score>
    <GeneratedOn>%s</GeneratedOn>
    <IsPass>%d</IsPass>
</ScoreInfo>
样本种子数据

INSERT INTO [dbo].[StudentMark] ([StudentId], [SubjectId], [ScoreInfo], GeneratedOn], [Score], [IsPass])
VALUES ('FC3CB475-B480-4129-9190-6DE880E2D581', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:10:15', 95, 1),
       ('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:10:15', 100, 1),
       ('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20', 25, 0),
       ('FC3CB475-B480-4129-9190-6DE880E2D581', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20', 82, 1);
我尝试了Stackoverflow问题中的一个示例代码

declare @name varchar(150)
set @name = 'John'

declare @score int
set @score = 75

DECLARE @ret varchar(500)
exec master..xp_sprintf @ret OUTPUT, 'Hello %s, your score is %d', @name, @score

PRINT @ret
我收到以下错误消息

执行扩展存储过程时出错:参数类型Msg无效 50003,级别1,状态0

请帮助我如何使用指定的表
[dbo].[StudentMark]

我提出了以下问题

请帮助我如何使用数字等格式说明符,

xp\u sprintf,因此无法在SQL Server中使用%d占位符。您必须将数字转换为字符串,然后使用它填充%s占位符

满足需求的最简单方法是使用内置的XML功能

update [target]
    SET [ScoreInfo] = [XmlValue]
    FROM [dbo].[StudentMark] AS target 
    JOIN (
             SELECT [StudentMarkId],
                (
                   SELECT 
                      [StudentMarkId],[StudentId], [SubjectId], [GeneratedOn], [Score], [IsPass] 
                    FROM [dbo].[StudentMark] AS innr 
                    WHERE outr.[StudentMarkId] = innr.[StudentMarkId]
                    FOR XML PATH('ScoreInfo'), TYPE
                 ) as [XmlValue]
             FROM [dbo].[StudentMark] AS outr
         ) AS source 
     ON target.[StudentMarkId] = source.[StudentMarkId]
将ScoreInfo设置为:

 <ScoreInfo>
    <StudentMarkId>%d</StudentMarkId>
    <StudentId>%s</StudentId>
    <SubjectId>%s</SubjectId>
    <Score>%d</Score>
    <GeneratedOn>%s</GeneratedOn>
    <IsPass>%d</IsPass>
 </ScoreInfo>

%d
%
%
%d
%
%d
对于每一行,在单个查询中。

xp\u sprintf,因此无法在SQL Server中使用%d占位符。您必须将数字转换为字符串,然后使用它填充%s占位符

满足需求的最简单方法是使用内置的XML功能

update [target]
    SET [ScoreInfo] = [XmlValue]
    FROM [dbo].[StudentMark] AS target 
    JOIN (
             SELECT [StudentMarkId],
                (
                   SELECT 
                      [StudentMarkId],[StudentId], [SubjectId], [GeneratedOn], [Score], [IsPass] 
                    FROM [dbo].[StudentMark] AS innr 
                    WHERE outr.[StudentMarkId] = innr.[StudentMarkId]
                    FOR XML PATH('ScoreInfo'), TYPE
                 ) as [XmlValue]
             FROM [dbo].[StudentMark] AS outr
         ) AS source 
     ON target.[StudentMarkId] = source.[StudentMarkId]
将ScoreInfo设置为:

 <ScoreInfo>
    <StudentMarkId>%d</StudentMarkId>
    <StudentId>%s</StudentId>
    <SubjectId>%s</SubjectId>
    <Score>%d</Score>
    <GeneratedOn>%s</GeneratedOn>
    <IsPass>%d</IsPass>
 </ScoreInfo>

%d
%
%
%d
%
%d
对于每一行,在单个查询中。

因为xp\u sprintf只支持“%s”,所以需要将任何数值转换为VARCHAR

修改您的示例如下:

声明@ret VARCHAR(500)
声明@name VARCHAR(150)
声明@val VARCHAR(10)
声明@score INT

set@name='John'
设置@score=75
设置@val=CAST(@score为VARCHAR(10))

EXEC master..xp_sprintf@ret输出,“您好%s,您的分数是%s”,@name,@val

PRINT@ret

因为xp\u sprintf只支持“%s”,所以您需要将任何数值强制转换为VARCHAR

修改您的示例如下:

声明@ret VARCHAR(500)
声明@name VARCHAR(150)
声明@val VARCHAR(10)
声明@score INT

set@name='John'
设置@score=75
设置@val=CAST(@score为VARCHAR(10))

EXEC master..xp_sprintf@ret输出,“您好%s,您的分数是%s”,@name,@val


PRINT@ret

为什么要使用xp\u sprintf?您有其他功能吗?如果是,请帮助我…您可以先阅读@JamesZ-好的,谢谢您的帮助,但是在这个
xp\u sprintf
中,我们如何使用
%d
?请您澄清一下……您不能使用%d,xp\U sprintf只支持%s。您必须手动将@score转换为字符串类型,然后将其与格式字符串“Hello%s,您的分数是%s”一起传递给xp\u sprintf。为什么要使用xp\u sprintf?您有其他函数吗?如果是,请帮助我…您可以先阅读@JamesZ-好的,谢谢您的帮助,但是在这个
xp\u sprintf
中,我们如何使用
%d
?请您澄清一下……您不能使用%d,xp\U sprintf只支持%s。您必须手动将@score转换为字符串类型,然后将其与格式字符串“Hello%s,您的分数是%s”一起传递给xp\u sprintf。您的部分回答了我的要求,但我的问题是如何在
xp\u sprintf
中使用
%d
。您的部分回答了我的要求,但我的问题是如何在
xp\u sprintf
中使用
%d