كيفية تحديد الاسم الداخلي من قيم الجدول متغير في MS SQL Server 2005
-
01-07-2019 - |
سؤال
اسم جدول مؤقت مثل #t1 يمكن تحديدها باستخدام
select @TableName = [Name]
from tempdb.sys.tables
where [Object_ID] = object_id('tempDB.dbo.#t1')
كيف يمكنني العثور على اسم الجدول قيمة متغير ، أيواحد أعلن من قبل
declare @t2 as table (a int)
والغرض من ذلك هو أن تكون قادرة على الحصول على المعلومات الوصفية عن الطاولة ، استخدام شيء من هذا القبيل
select @Headers = dbo.Concatenate('[' + c.[Name] + ']')
from sys.all_columns c
inner join sys.tables t
on c.object_id = t.object_id
where t.name = @TableName
على الرغم من أن درجة الحرارة الجداول لا بد من النظر في tempdb.sys.tables
بدلا من sys.tables
.حيث كنت تبحث عن طاولة الكرام المتغيرات ؟
وأنا أدرك الآن أنني لا يمكن أن أفعل ما أريد أن أفعله ، وهو كتابة وظيفة عامة لتنسيق الجدول قيمة المتغيرات في الجداول html.بالنسبة للمبتدئين في sql server 2005 لا يمكنك تمرير الجدول الكرام المعلمات:
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters
وعلاوة على ذلك, في sql server 2008 المعلمات يجب أن تكون كتبته بقوة لذلك سوف تعرف دائما عدد و نوع من الأعمدة.
المحلول
أنا لا أعتقد أنك يمكن أن متغيرات الجدول يتم إنشاؤها في الذاكرة وليس في tempdb.
نصائح أخرى
الجدول متغير البيانات الوصفية هو للعرض في tempdb.sys.tables
أيضا.هذا هو التحقق من أدناه
declare @t2 as table ( [38F055D8-25D9-4AA6-9571-F436FE] int)
SELECT t.name, t.object_id
FROM tempdb.sys.tables t
JOIN tempdb.sys.columns c
ON t.object_id = c.object_id
WHERE c.name = '38F055D8-25D9-4AA6-9571-F436FE'
نتائج سبيل المثال
name object_id
------------------------------ -----------
#4DB4832C 1303675692
ولكن ستلاحظ اسم الكائن هو السيارات ولدت و الدببة لا علاقة اسم المتغير.
إذا لم يكن لديك مضمونة فريدة من نوعها اسم العمود يمكنك استخدام عامل التصفية على النحو الوارد أعلاه و الجدول متغير واحد على الأقل التوالي في أنه يمكنك (من SQL Server 2008 فصاعدا) استخدام %%physloc%%
و DBCC PAGE
لتحديد هذه المعلومات.المثال أدناه.
DECLARE @t2 AS TABLE ( a INT)
INSERT INTO @t2
VALUES (1)
DECLARE @DynSQL NVARCHAR(100)
SELECT TOP (1) @DynSQL = 'DBCC PAGE(2,' + CAST(file_id AS VARCHAR) + ',' +
CAST( page_id AS VARCHAR) +
',1) WITH TABLERESULTS'
FROM @t2
CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
DECLARE @DBCCPage TABLE (
[ParentObject] [VARCHAR](100) NULL,
[Object] [VARCHAR](100) NULL,
[Field] [VARCHAR](100) NULL,
[VALUE] [VARCHAR](100) NULL )
INSERT INTO @DBCCPage
EXEC (@DynSQL)
SELECT VALUE AS object_id,
OBJECT_NAME(VALUE, 2) AS object_name
FROM @DBCCPage
WHERE Field = 'Metadata: ObjectId'
من الكتب على الانترنت:
جدول متغير يتصرف وكأنه متغير محلي.فقد واضحة المعالم نطاق ، الذي هو وظيفة الإجراء المخزن أو الدفعة التي أعلنت.
ونظرا لهذا ، ينبغي أن يكون هناك لا حاجة للبحث عن هذه القيمة في وقت التشغيل لأن عليك أن تعرف أنه في وقت التصميم.
موضوع يمر التعسفي قوائم/المصفوفات في SQL Server 2005 وظيفة أو sproc,
على الأقل باقة طريقة أعرف هو استخدام XML متغير.إذا رغبت في ذلك ، أن متغير XML يمكن أن يكون بقوة XML المكتوب النوع الذي يرتبط w/ مخطط XML.
وبالنظر إلى قائمة تمريرها إلى الإجراء/وظيفة XML, يمكنك استخراج تلك القائمة إلى متغير الجدول أو الجدول المؤقت عبر "التقطيع"."أجاد" XML يعني أن التحويل في الاتجاه المعاكس-من XML إلى مجموعة الصفوف(s).(ل XML شرط يؤدي إلى صفوف XML التحول.)
في الجدول المعرفة من قبل المستخدم وظيفة
CREATE FUNCTION [dbo].[udtShredXmlInputBondIdList]
(
-- Add the parameters for the function here
@xmlInputBondIdList xml
)
RETURNS
@tblResults TABLE
(
-- Add the column definitions for the TABLE variable here
BondId int
)
AS
BEGIN
-- Should add a schema validation for @xmlInputIssuerIdList here
--Place validation here
-- Fill the table variable with the rows for your result set
INSERT @tblResults
SELECT
nref.value('.', 'int') as BondId
FROM
@xmlInputBondIdList.nodes('//BondID') as R(nref)
RETURN
END
إذا كان @xmlInputBondIdList هو XML جزء من المتوقع هيكل مثل ذلك على الفور دون و هو الاحتجاج على النحو التالي
DECLARE @xmlInputBondIdList xml
SET @xmlInputBondIdList =
'<XmlInputBondIdList>
<BondID>8681</BondID>
<BondID>8680</BondID>
<BondID>8684</BondID>
</XmlInputBondIdList>
'
SELECT *
FROM [CorporateBond].[dbo].[udtShredXmlInputBondIdList]
(@xmlInputBondIdList)
وسوف تكون النتيجة مجموعة الصفوف
BondId
8681
8680
8684
بضعة أمثلة أخرى يمكن العثور عليها في http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=678284&SiteID=1